본문 바로가기

설계

[디자인 패턴] 어댑터 패턴 (Adapter Pattern) - python 예제 코드

어댑터 패턴(Adapter Pattern)은 서로 다른 두 개의 인터페이스를 가진 클래스들 간의 상호작용을 가능하게 해주는 디자인 패턴 중 하나입니다.

1. 핵심 아이디어


어댑터 패턴의 핵심 아이디어는 기존 클래스를 수정하지 않고, 그 클래스의 인터페이스를 다른 인터페이스로 변환시켜주는 것입니다. 이렇게 하면, 기존 클래스와 새로운 클래스 간의 호환성을 유지하면서, 코드를 재사용할 수 있게 됩니다.


파이썬으로 어댑터 패턴을 구현할 때는, 일반적으로 클래스를 상속하여 새로운 클래스를 만들어서 구현합니다. 이때, 새로운 클래스는 새로운 인터페이스를 구현하면서, 기존 클래스의 인스턴스를 내부에 포함시키는 방식으로 작성합니다.

2. 예제코드


다음은 파이썬으로 어댑터 패턴을 구현한 코드 예제입니다.

class Target:
    """
    새로운 인터페이스를 정의하는 클래스
    """
    def request(self) -> str:
        return "Target: The default target's behavior."

class Adaptee:
    """
    기존의 인터페이스를 가진 클래스
    """
    def specific_request(self) -> str:
        return ".eetpadA eht fo roivaheb laicepS"

class Adapter(Target):
    """
    Target 인터페이스를 구현하는 클래스
    Adaptee 클래스의 인스턴스를 내부에 포함시키면서,
    Target 인터페이스의 request 메서드를 구현합니다.
    """
    def __init__(self, adaptee: Adaptee) -> None:
        self.adaptee = adaptee

    def request(self) -> str:
        return f"Adapter: (TRANSLATED) {self.adaptee.specific_request()[::-1]}"

def client_code(target: Target) -> None:
    """
    Target 인터페이스를 사용하는 클라이언트 코드
    """
    print(target.request())

if __name__ == "__main__":
    adaptee = Adaptee()
    adapter = Adapter(adaptee)
    print("Adaptee: " + adaptee.specific_request())
    print("Adapter: " + adapter.request())

    client_code(target=adapter)


위 코드에서 Target 클래스는 새로운 인터페이스를 정의하고, Adaptee 클래스는 기존의 인터페이스를 가진 클래스입니다.

Adapter 클래스는 Target 인터페이스를 구현하는 클래스로, Adaptee 클래스의 인스턴스를 내부에 포함시키면서, Target 인터페이스의 request 메서드를 구현합니다.

3. 장점

  • 호환성을 유지하면서 기존의 코드를 재사용할 수 있습니다.
  • 코드의 유연성을 높여주며, 클래스 간의 결합도를 낮출 수 있습니다.
  • 기존 코드를 수정하지 않고도 새로운 인터페이스를 추가할 수 있습니다.

4. 단점

  • 어댑터 패턴을 사용하면 중간 단계가 하나 더 추가되기 때문에, 성능이 조금 떨어질 수 있습니다.
  • 어댑터 패턴을 사용하면, 기존 코드와 새로운 코드 간의 차이점을 명확히 이해하고 구현해야 하기 때문에, 구현이 어려울 수 있습니다.

5. 결론

어댑터 패턴은 기존의 코드를 유지하면서 새로운 인터페이스를 추가하고자 할 때 유용한 패턴이며, 코드의 유연성과 재사용성을 높일 수 있습니다. 하지만, 성능과 구현의 어려움을 감안하여 사용하는 것이 좋습니다.