파이썬에서 디자인 패턴 'Template Method' 배우기

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

■ Template Method(템플릿 메소드 패턴)



Template Method 패턴(템플릿 메소드 패턴)은 GoF(Gang of Four; 4명의 갱들)에 의해 정의된 디자인 패턴의 하나이다. 「행동에 관한 패턴」에 속한다. Template Method 패턴의 목적은, 어느 처리의 대략적인 알고리즘을 미리 결정해 두고, 그 알고리즘의 구체적인 설계를 서브 클래스에 맡기는 것이다. 따라서 시스템의 프레임 워크를 구축하는 수단으로 잘 활용됩니다.

UML 클래스 diagram




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

■ "Template Method" 샘플 프로그램



실제로 Template Method 패턴을 활용한 샘플 프로그램을 움직여서 다음과 같은 동작의 모습을 확인하고 싶습니다.
  • 문자 "H"는 5 회 연속으로 표시됩니다. 또한 앞뒤로 "<<", ">>"로 묶어 표시
  • 문자열 "Hello, World!"를 5 회 연속으로 표시합니다. 또한 테두리로 묶어 표시
  • $ python Main.py 
    <<HHHHH>>
    
    +-------------+
    |Hello, World!|
    |Hello, World!|
    |Hello, World!|
    |Hello, World!|
    |Hello, World!|
    +-------------+
    

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



    Git 저장소에도 비슷한 코드가 있습니다.
    htps : // 기주 b. 이 m / 싹 / s dy _ f_에서 ㅇ ㄹ
  • 디렉토리 구성
  • .
    ├── Main.py
    └── templatemethod
        ├── __init__.py
        └── display.py
    

    (1) AbstractClass (추상 클래스)의 역할


    AbstractClass 역할은 템플릿 메서드를 구현합니다. 또한 템플릿 메서드에서 사용하는 추상 메서드를 선언합니다. 이 추상 메소드는, 서브 클래스인 ConcreteClass 역에 의해 구현됩니다.
    샘플 프로그램에서는, AbstractDisplay 클래스가, 이 역할을 노력합니다.

    templatemethod/display.py
    from abc import ABCMeta, abstractmethod
    
    class AbstractDisplay(metaclass=ABCMeta):
        @abstractmethod
        def print(self):
            pass
    
        @abstractmethod
        def open(self):
            pass
    
        @abstractmethod
        def close(self):
            pass
    
        def display(self):
            self.open()
            for _ in range(5):
                self.print()
            self.close()
    

    (2) ConcreteClass (구상 클래스)의 역할


    AbstractClass 역할로 정의 된 추상 클래스를 구체적으로 구현합니다. 여기서 구현한 메서드는 AbstractClass 역할의 템플릿 메서드에서 호출됩니다.
    샘플 프로그램에서는, CharDisplay 클래스와, StringDisplay 클래스가, 이 역할을 노력합니다.

    templatemethod/display.py
    class CharDisplay(AbstractDisplay):
        def __init__(self, ch):
            self.__ch = ch
    
        def open(self):
            print('<<', end='')
    
        def print(self):
            print(self.__ch, end='')
    
        def close(self):
            print('>>')
    
    class StringDisplay(AbstractDisplay):
        def __init__(self, string):
            self.__string = string
            self.__width = len(string)
    
        def open(self):
            self.__printLine()
    
        def print(self):
            print("|{0}|".format(self.__string))
    
        def close(self):
            self.__printLine()
    
        def __printLine(self):
            print('+', end='')
            for _ in range(self.__width):
                print('-', end='')
            print('+')
    

    (3) Client(이용자)의 역할



    샘플 프로그램에서는, startMain 메소드가, 이 역할을 노력합니다.

    Main.py
    from templatemethod.display import CharDisplay, StringDisplay
    
    def startMain():
        d1 = CharDisplay('H')
        d2 = StringDisplay("Hello, World!")
        d1.display()
        print("")
        d2.display()
    
    if __name__ == '__main__':
        startMain()
    

    ■ 참고 URL


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