파이썬에서 디자인 패턴 "Adapter"를 배우십시오.

GoF의 디자인 패턴을 학습하는 소재로서, 서적 「 증보 개정판 Java 언어로 배우는 디자인 패턴 입문 」가 참고가 되는 것 같네요. 다만, 다루어지고 있는 실례는, JAVA 베이스이기 때문에, 자신의 이해를 깊게 하기 위해서도, Python에서 동등의 프랙티스에 도전해 보았습니다.

■ Adapter(어댑터 패턴)



Adapter 패턴(어댑터 패턴)은 GoF(Gang of Four; 4명의 갱들)에 의해 정의된 디자인 패턴의 하나이다. Adapter 패턴을 사용하면, 기존의 클래스에 대해서 수정을 가하지 않고, 인터페이스를 변경할 수 있다. Adapter 패턴을 실현하기 위한 수법으로서 "계승을 이용한 수법"과 "위양을 이용한 수법"이 존재한다.

UML 클래스 diagram





1. 상속을 이용한 Adapter



상속을 이용한 Adapter는, 이용하고 싶은 클래스의 서브 클래스를 작성해, 그 서브 클래스에 대해서 필요한 인터페이스를 구현하는 것으로 실현된다.


2. 위양을 이용한 Adapter



위양을 이용한 Adapter는, 이용하고 싶은 클래스의 인스턴스를 생성해, 그 인스턴스를 다른 클래스로부터 이용하는 것으로 실현된다.

(이상 위키피디아(Wikipedia)에서 인용)

■ "Adapter" 샘플 프로그램



실제로 Adapter 패턴을 활용한 샘플 프로그램을 움직여서 다음과 같은 동작의 모습을 확인하고 싶습니다.
  • 문자열을 괄호로 묶어서 표시합니다.
  • 캐릭터 라인의 전후에, *표를 붙여 표시한다
  • $ python Main.py 
    (Hello)
    *Hello*
    

    ■ 샘플 프로그램에 대해 자세히 알아보기



    Git 저장소에도 비슷한 코드가 있습니다.
    htps : // 기주 b. 이 m / 싹 / s dy_ 오 f_로 해 응 _ 파테 r
  • 디렉토리 구성
  • .
    ├── Main.py
    └── adapter
        ├── __init__.py
        ├── banner.py
        ├── print.py
        └── print_banner.py
    

    (1) Target(대상)의 역할


    Target 역할은 인스턴스 동작과 관련된 인터페이스를 결정합니다.
    샘플 프로그램에서는, Print 클래스가, 이 역할을 노력합니다.

    adapter/print.py
    from abc import ABCMeta, abstractmethod
    
    class Print(metaclass=ABCMeta):
        @abstractmethod
        def printWeak(self):
            pass
    
        @abstractmethod
        def printStrng(self):
            pass
    

    (2) Client(의뢰자)의 역할


    Target 역의 메소드를 사용해, 일을 하는 역입니다.
    샘플 프로그램에서는, startMain 메소드가, 이 역할을 노력합니다.

    Main.py
    from adapter.print_banner import PrintBanner
    
    def startMain():
        p = PrintBanner("Hello")
        p.printWeak()
        p.printStrng()
    
    if __name__ == '__main__':
        startMain()
    

    (3) Adaptee(적합되는 측)의 역할


    Adapter 역할 속에서 실제로 동작하는 메소드를, 여기에서 구현합니다.
    샘플 프로그램에서는, Banner 클래스가, 이 역할을 노력합니다.

    adapter/banner.py
    class Banner(object):
        def __init__(self, string):
            self.__string = string
    
        def showWithParen(self):
            print("({0})".format(self.__string))
    
        def showWithAster(self):
            print("*{0}*".format(self.__string))
    

    (4) Adapter(적합하는 측)의 역할


    Adapter 역은, Target 역의 인터페이스를 구현하고 있는 클래스입니다.
    샘플 프로그램에서는, PrintBanner 클래스가, 이 역할을 노력합니다.
    Adapter 패턴을 실현하기 위한 기법으로서, 다음의 2개의 기법이 존재합니다.
  • 상속을 이용한 수법
  • 위양을 이용한 수법

  • □ 상속을 이용한 샘플 프로그램



    adapter/print_banner.py
    from adapter.banner import Banner
    from adapter.print import Print
    
    class PrintBanner(Banner, Print):
        def __init__(self, string):
            super(PrintBanner, self).__init__(string)
    
        def printWeak(self):
            self.showWithParen()
    
        def printStrng(self):
            self.showWithAster()
    

    □ 위양을 이용한 샘플 프로그램



    adapter/print_banner.py
    from adapter.banner import Banner
    from adapter.print import Print
    
    class PrintBanner(Print):
        def __init__(self, string):
            self.__banner = Banner(string)
    
        def printWeak(self):
            self.__banner.showWithParen()
    
        def printStrng(self):
            self.__banner.showWithAster()
    

    ■ 참고 URL


  • 「Java 언어로 배우는 디자인 패턴 입문」을 끝내고(없음)
  • Adapter 패턴 from "tachikawa844의 일기"
  • 좋은 웹페이지 즐겨찾기