As i wish

[Design pattern] Template method pattern (템플릿 메서드 패턴) 본문

Design Pattern

[Design pattern] Template method pattern (템플릿 메서드 패턴)

어면태 2019. 5. 5. 23:40

안녕하세요.

오늘 포스팅해볼 패턴은 템플릿 메서드 패턴입니다.

일단 정의 부터 알아보겠습니다.

템플릿 메서드 패턴이란?

메서드에서 알고리즘의 골격을 정의한다. 알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있다. 템플릿 메서드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브클래스에서 특정 단계를 재정의 할 수 있다.

말 그대로 알고리즘 골격을 정의하고 알고리즘의 여러 단계 중 일부를 서브 클래스에서 구현하는 것이죠.

어렵지 않은 패턴이죠.

 

예를 들어 커피와 티를 만든다고 하였을 때에

- 커피 만드는 법

1. 물을 끓인다.

2. 끓는 물에 커피를 우려낸다.

3. 커피를 컵에 따른다.

4. 설탕과 우유를 추가한다.

- 홍차 만드는 법

1. 물을 끓인다.

2. 끓는 물에 차를 우려낸다.

3. 차를 컵에 따른다.

4. 레몬을 추가한다.

 

요렇게 거의 비슷한 알고리즘을 가지고 있죠.

이에 따라  CaffeineBeverage라는 추상 클래스를 만들고 prepareRecipe()라는 메서드를 만들어서

위와 같은 알고리즘을 구성하죠.

중복되는 방법 인 1. 물을 끓인다, 3. 차를 컵에 따른다. 는 추상 클래스(CaffeineBeverage)에서 구현을 하고

나머지인 2, 4 번은 서브클래스에서 구현을 하는 것이죠.

즉, 1 ~ 4번에 알고리즘 중에 몇 가지 (2, 4번)을 서브클래스에서 구현하기 때문에 템플릿 메서드 패턴을 적용했다고 볼 수 있죠.

역시 코드로 만나보겠습니다!

# -*- coding: utf-8 -*-
# TemplateMethod Pattern
 
import abc

class CaffeineBeverage:
  __metaclass__ = abc.ABCMeta

  def prepareRecipe(self):
    self.boilWater()
    self.brew()
    self.pourInCup()
    self.addCondiments()

  def boilWater(self):
    print "Boil water"

  def pourInCup(self):
    print "Pour in cup"

  @abc.abstractmethod
  def brew(self):
    pass

  @abc.abstractmethod
  def addCondiments(self):
    pass

class Coffee(CaffeineBeverage):
  def brew(self):
    print "Making coffee"

  def addCondiments(self):
    print "Add milk and sugar"

class Tea(CaffeineBeverage):
  def brew(self):
    print "Making tea"

  def addCondiments(self):
    print "Add lemon"

coffee = Coffee()
tea = Tea()

coffee.prepareRecipe()
tea.prepareRecipe()

이렇게 서브클래스인 Coffee, Tea에서 추상클래스 안에 메서드 알고리즘의 한부분을 구현 함으로써 템플릿 메서드 패턴을 완성 할 수 있죠.

이렇게 되면 알고리즘이 한곳에 몰려 있기 때문에 관리하기도 쉽고 새로운 서브클래스를 만들기도 한결 편하겠죠?

Comments