[파이썬] 브리지 패턴과 추상화 분리

브리지 패턴은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나입니다. 이 패턴은 추상화와 구현을 분리하여 두 개의 클래스 계층을 독립적으로 확장할 수 있도록 도움을 줍니다. 이번 포스트에서는 파이썬에서 브리지 패턴과 추상화 분리에 대해 알아보겠습니다.

브리지 패턴은 다른 클래스 계층의 기능을 연결하여 두 개의 계층을 독립적으로 확장할 수 있도록 하는 구조입니다. 이 패턴은 추상화와 구현을 분리하기 때문에, 변경이 있는 경우 한 쪽 계층을 수정하지 않고 다른 쪽 계층을 확장할 수 있습니다. 이를 통해 코드의 유연성과 확장성을 향상시킬 수 있습니다.

파이썬에서 브리지 패턴을 구현하기 위해 추상화와 구현을 나누는 인터페이스와 클래스를 사용합니다. 추상화는 기능의 추상 인터페이스를 제공하고, 구현은 실제 구현을 제공합니다. 이를 통해 추상화와 구현을 독립적으로 확장할 수 있습니다.

아래 코드 예시를 통해 파이썬에서 브리지 패턴을 어떻게 구현할 수 있는지 살펴보겠습니다.

# 추상화의 인터페이스 정의
class Abstraction:
    def __init__(self, implementation):
        self.implementation = implementation

    def operation(self):
        return self.implementation.do_operation()

# 구현의 인터페이스 정의
class Implementation:
    def do_operation(self):
        raise NotImplementedError()

# 구현의 실제 클래스 정의
class ConcreteImplementation1(Implementation):
    def do_operation(self):
        return "Operation 1"

class ConcreteImplementation2(Implementation):
    def do_operation(self):
        return "Operation 2"

# 추상화와 구현을 연결하는 클래스 정의
class ConcreteAbstraction(Abstraction):
    def operation(self):
        return f"Abstracted {self.implementation.do_operation()}"

위 코드에서 Abstraction 클래스는 추상화의 인터페이스를 정의하고, Implementation 클래스는 구현의 인터페이스를 정의합니다. ConcreteImplementation1ConcreteImplementation2는 구현의 실제 클래스입니다.

ConcreteAbstraction 클래스는 Abstraction 클래스를 상속하며, 구현의 인스턴스를 생성하여 추상화와 구현을 연결합니다. 이를 통해 operation 메소드를 실행할 때, 추상화와 구현이 연결되어 동작하게 됩니다.

# 브리지 패턴 사용 예시
implementation1 = ConcreteImplementation1()
implementation2 = ConcreteImplementation2()

abstraction1 = ConcreteAbstraction(implementation1)
abstraction2 = ConcreteAbstraction(implementation2)

print(abstraction1.operation())  # Output: Abstracted Operation 1
print(abstraction2.operation())  # Output: Abstracted Operation 2

위 예시에서는 ConcreteAbstraction 클래스에 ConcreteImplementation1ConcreteImplementation2를 연결하여 operation 메소드를 실행한 결과를 출력합니다. Abstracted 접두사가 붙은 결과는 추상화와 구현이 연결되었음을 나타냅니다.

브리지 패턴은 코드의 유연성과 확장성을 향상시키기 위해 추상화와 구현을 분리하는 유용한 디자인 패턴입니다. 파이썬에서도 이 패턴을 적용하여 객체 지향 프로그래밍을 보다 효과적으로 구현할 수 있습니다.