소프트웨어에 대한 모든 것

[디자인패턴][Template Method] 템플릿 메소드 패턴 본문

시스템 설계 및 디자인/디자인 패턴

[디자인패턴][Template Method] 템플릿 메소드 패턴

앤테바 2022. 3. 25. 10:45
반응형

템플릿 메소드 정의

  • 알고리즘의 골격만 정의하고 각 단계에 대한 구체적인 처리는 서브클래스에게 위임하는 패턴
  • 행동 패턴 중 하나로 굉장히 자주 사용하는 패턴 중 하나

 

템플릿 메소드 패턴은
슈퍼클래스에서 알고리즘 뼈대만 작성하고,
서브클래스에서 구체적인 구현을 재정의하는 패턴

 

템플릿 메소드 클래스 다이어그램

template method 패턴 Class Diagram

템플릿 메소드 활용

Pizza의 go() 함수가 템플릿 메소드(알고리즘 골격)에 해당하고, Pizza를 상속받은 NYPizza, KoreaPizza 클래스가 있습니다. NYPizza는 뉴욕 스타일로 피자를 만들어야 하기 때문에 prepare(), cook(), eat() 함수를 재정의 합니다. KoreaPizza 또한 한국식에 맞게 함수를 재정의 합니다.

 

결국 피자를 만들기 위한 뼈대만 Pizza 클래스에 정의하고 피자를 만드는 방법의 구체적인 처리는 서브클래스에게 위임하는 패턴이 템플릿 메소드 패턴입니다.

from abc import abstractmethod


class Pizza:
    def go(self):
        """ template metod """
        self.prepare()
        self.cook()
        self.eat()

    @abstractmethod
    def prepare(self):
        pass

    @abstractmethod
    def cook(self):
        pass

    @abstractmethod
    def eat(self):
        pass


class NYPizza(Pizza):
    def prepare(self):
        print('Prepare NewYork Style Pizza')
        print('밀가루 도우 준비')

    def cook(self):
        print('Cook NYPizza')
        print('Add onions')
        print('Add ham')

    def eat(self):
        print("NYPizza 시식")


class KoreaPizza(Pizza):
    def prepare(self):
        print('Prepare Korea Style Pizza')
        print('쌀가루 도우 준비')

    def cook(self):
        print('Cook KoreaPizza')
        print('Add garlics')
        print('Add 불고기')

    def eat(self):
        print("KoreaPizza 시식")


ny_pizza = NYPizza()
ny_pizza.go()

korea_pizza = KoreaPizza()
korea_pizza.go()

출력

Prepare NewYork Style Pizza
밀가루 도우 준비
Cook NYPizza
Add onions
Add ham
NYPizza 시식
Prepare Korea Style Pizza
쌀가루 도우 준비
Cook KoreaPizza
Add garlics
Add 불고기
KoreaPizza 시식

 

참고 자료

https://www.tutorialspoint.com/python_design_patterns/python_design_patterns_template.htm

https://stackabuse.com/template-method-design-pattern-in-python/

https://sbcode.net/python/template/

 

 

 

반응형
Comments