본문 바로가기

설계

[디자인 패턴] 브릿지 패턴 (Bridge Pattern) - python 예제 코드

브릿지 패턴은 객체 지향 프로그래밍에서 구현하는 패턴 중 하나로, 클래스의 인터페이스와 구현부를 분리하여 두 개를 독립적으로 변경할 수 있도록 하는 디자인 패턴입니다. 이를 통해 시스템이 더욱 유연하고 확장성 있게 구현될 수 있습니다.

1. 두가지 계층

브릿지 패턴은 두 개의 계층으로 이루어집니다. 첫 번째 계층은 추상화 계층입니다. 이 계층은 클라이언트가 사용할 인터페이스를 정의합니다. 두 번째 계층은 구현 계층입니다. 이 계층은 추상화 계층이 정의한 인터페이스를 구현합니다.

추상화 계층과 구현 계층은 서로 독립적으로 변경될 수 있으며, 추상화 계층에서 구현 계층을 참조합니다. 이렇게 하면 구현 계층을 변경하더라도 추상화 계층은 변경되지 않으므로 클라이언트 코드를 수정할 필요가 없습니다. 또한, 구현 계층에서 새로운 구현을 추가하더라도 추상화 계층은 변경되지 않으므로 클라이언트 코드를 수정할 필요가 없습니다.

2. 예제 코드


다음은 파이썬으로 구현된 브릿지 패턴 예제 코드입니다.

from abc import ABC, abstractmethod

# 추상화 계층
class Shape(ABC):
    def __init__(self, color):
        self._color = color

    @abstractmethod
    def draw(self):
        pass

# 구현 계층
class Color:
    def __init__(self, color):
        self._color = color

    def __str__(self):
        return self._color

# 구현 계층
class RedColor(Color):
    def __init__(self):
        super().__init__("Red")

# 구현 계층
class BlueColor(Color):
    def __init__(self):
        super().__init__("Blue")

# 구현 계층
class Circle(Shape):
    def __init__(self, color):
        super().__init__(color)

    def draw(self):
        return f"Drawing a Circle with {str(self._color)} color"

# 구현 계층
class Square(Shape):
    def __init__(self, color):
        super().__init__(color)

    def draw(self):
        return f"Drawing a Square with {str(self._color)} color"

# 클라이언트 코드
circle_red = Circle(RedColor())
print(circle_red.draw())  # Drawing a Circle with Red color

square_blue = Square(BlueColor())
print(square_blue.draw())  # Drawing a Square with Blue color


위 코드에서는 Shape 추상화 계층과 Color 구현 계층이 있습니다. Shape 추상화 계층은 draw 메서드를 가지며, 이 메서드를 구현하는 구현 클래스로 Circle과 Square이 있습니다. Color 구현 계층은 색을 나타내는 클래스입니다. 이 구현 계층에서 RedColor와 BlueColor 구현 클래스를 정의합니다.

클라이언트 코드에서는 Circle 클래스와 Square 클래스를 사용합니다. 이 클래스들은 Shape 추상화 계층의 메서드인 draw를 호출합니다. 이때 생성자에서 색을 인자로 받아와 Color 구현 계층의 객체를 생성합니다.

이 예제에서는 Color 구현 계층의 클래스가 추가되더라도 Shape 추상화 계층의 코드는 변경되지 않습니다. 또한, Circle과 Square 클래스가 Color 클래스와 독립적으로 변경될 수 있으므로 유연성이 좋습니다. 예를 들어, 새로운 도형 클래스를 추가하더라도 색과 관련된 코드는 변경할 필요가 없습니다.

이렇게 브릿지 패턴은 추상화 계층과 구현 계층을 분리하여 시스템을 더욱 유연하고 확장성 있게 구현할 수 있도록 합니다.

3. 장점

  • 시스템의 유연성과 확장성을 향상시킵니다. 추상화 계층과 구현 계층을 분리함으로써, 각 계층을 독립적으로 변경할 수 있습니다. 새로운 구현 클래스를 추가해도 기존 코드를 수정할 필요가 없습니다.
  • 구현 세부 정보를 감추어서 시스템의 보안성을 향상시킵니다. 구현 계층을 추상화 계층으로부터 분리하여 구현 세부 정보를 감춤으로써, 시스템의 보안성을 향상시킬 수 있습니다.

4. 단점

  • 복잡성이 증가할 수 있습니다. 추상화 계층과 구현 계층 사이의 연결을 유지하기 위해 추가적인 클래스가 필요합니다. 이로 인해 코드 복잡성이 증가할 수 있습니다.
  • 추상화 계층과 구현 계층 사이의 성능 저하가 발생할 수 있습니다. 브릿지 패턴에서는 추상화 계층과 구현 계층 사이의 메시지 전달을 위해 추가적인 오버헤드가 발생합니다. 이로 인해 시스템의 성능 저하가 발생할 수 있습니다.

5. 마무리

따라서, 브릿지 패턴은 시스템의 유연성과 보안성을 향상시키지만, 코드 복잡성과 성능 저하라는 단점도 있습니다. 이를 잘 고려하여 패턴을 선택해야 합니다.