7_template_method_pattern

7. The Template Method Pattern

1. 템플릿 메소드패턴 개요

템플릿 메소드 패턴에서 단계를 원시 연산(Primitive Operation)이라고 한다.
각 단계에 추상 메소드가 있고, 템플릿 메소드가 전체 알고리즘을 구현한다.

  • 템플릿 메소드 패턴이 적합한 상황
    여러 알고리즘 또는 클래스가 비슷하거나 같은 로직을 구현할 때
    알고리즘을 단계벌로 서브클래스화해 코드의 중복을 줄일 수 있는 경우
    서브클래스를 오버라이드해 여러 알고리즘을 구현할 수 있는 경우

2. 템플릿 메소드패턴의 이해

  • 목적
    알고리즘의 뼈대를 원시 연산으로 구현
    알고리즘의 구조를 수정하지 않고 일부 서브클래스를 재정의
    코드의 재사용과 중복 최소화
    공통 인터페이스 및 구현 활용

  • 구성 요소
    AbstractClass : 알고리즘의 단계를 정의하는 인터페이스
    ConcreteClass : 단계별 서브클래스
    template_method() : 단계별 메소드를 호출하는 알고리즘 정의

3. 코드 및 설명

__author__ = 'Chetan'

from abc import  ABCMeta, abstractmethod

class Compiler(metaclass=ABCMeta):
    @abstractmethod
    def collectSource(self):
        pass

    @abstractmethod
    def compileToObject(self):
        pass

    @abstractmethod
    def run(self):
        pass

    def compileAndRun(self):
        self.collectSource()
        self.compileToObject()
        self.run()

class iOSCompiler(Compiler):
    def collectSource(self):
        print("Collecting Swift Source Code")

    def compileToObject(self):
        print("Compiling Swift code to LLVM bitcode")

    def run(self):
        print("Program runing on runtime environment")


iOS = iOSCompiler()
iOS.compileAndRun()
  • AbstractClass
    알고리즘의 각 단계를 정의하는 추상 메소드로 구성돼 있다.
    구상 서브클래스가 오버라이트한다.
  • template_method()
    알고리즘의 뼈대를 정의
    전체 알고리즘을 정의하는 여러 추상 메소드를 호출
  • ConcreteClass
    여러 추상 메소드로 구성된알고리즘의 서브클래스를 구현한다.

4. 후크(Hook)

후크는 추상 클래스에 정의된 메소드
후크는 서브클래스가 알고리즘 중간 단계를 제어할 수 있는 기능을 제공한다.
서브클래스는 후크를 꼭 사용하지 않아도 된다.

서브클래스가 반드시 구현해야 하는 부분은 추상 메소드를 사용하고 선택적인 부분은 후크를 사용
-> 정의해야하는 일부 메소드를 후크를 사용하여 따로 사용

5. 할리우드 원칙(Hollywood Principle)과 탬플릿 메소드

할리우드 원칙은 “먼저 연락하지 마세요. 저희가 연락드리겠습니다.”(Don’t call us, we’ll call you) 에 기반 객체지향에서 하위 요소는 할리우드 원칙을 기반으로 메인 시스템에 끼어 들어갈(Hook이용) 수 있다.
하지만 상위 요소가 언제 어떤 하위 요소가 필요한지 결정
-> 저희가 연락드리겠습니다.
템플릿 메소드 패턴은 상위추상 클래스가 알고리즘에 필요한 단계를 정의한다.
즉, 알고리즘에 따라 각 단계에 ㅏㅁㅈ는 하위 클래스가 호출됨

6. 탬플릿 메소드 패턴의 장담점

  • 장점
    코드의 중복이 없다.
    컴퓨지션이 아닌 상속을 사용함으로 코드 재활용 가능
    -> 일부 함수만 오버라이드
    알고리즘의 각 단계를 서브클래스에서 구현할 수 있는 유연성 제공
  • 단점
    코드 디버깅 및 이해가 어려울 수 있음
    구현하지 않아도 되는 메소드를 구현 혹은 추상 메소드를 구현하지 않는 실수할수 있다.
    어떤 계층에서라도 수정한다면 전체 구조 및 구현에 영향을 줄 수 있어 유지보수가 어렵다