프로그래밍/DesignPattern

템플릿 메소드 패턴 I

모지사바하 2007. 7. 31. 13:17
* 알고리즘 캡슐화

public abstract class CaffeineBeverage{

final void prepareRecipe(){

// 템플릿내에서 알고리즘의 각 단계는 메소드로 표현된다.

  boilWater();
  brew();
  pourInCup();
  adCondiments();
}

abstract void brew(); // 서브클래스에서 처리되는 메소드도 있고
abstract void addCondiments();

void boilWater(){

// 어떤 메소드는 이 클래스 내에서 처리되기도 한다...

  System.out.println("물 끓이는 중");
}

void pourInCup(){
  System.out.println("컵에 따르는 중");
}

}

public class Tea extends CaffeineBeverage{
  public void brew(){
    System.out.println("차를 우려내는 중");
  }
  public void addCondiments(){
    System.out.println("레몬을 추가하는 중");
  }
}

public class Coffee extends CaffeineBeverage{
  public void brew(){
    System.out.println("커피를 우려내는 중");
  }
  public void addCondiments(){
    System.out.println("설탕과 프림을 추가하는 중");
  }
}

위 소스에서 prepareRecipe() 메소드가 바로 템플릿 메소드 이다.
그 이유는
① prepairRecipe()도 메소드 이다
② 어떤 알고리즘에 대한 템플릿(틀) 역할을 한다. 이 경우에는 카페인이 들어있는 음료를 만들기 위한 알고리즘에 대한 템플릿이다.


템플릿 메소드에서는 알고리즘의 각 단계들을 정의하며, 그 중 한 개 이상의 단계가 서브클래스에 의해 제공될 수 있다.


* 템플릿 메소드로부터 무엇을 얻을 수 있나 ?

템플릿 메소드 패턴을 사용하지 않았을 때

① Coffee와 Tea가 각각 작업을 처리한다. 두 클래스에서 각자 알고리즘을 수행한다.
② Coffee와 Tea에 중복된 코드가 있다.
③ 알고리즘이 바뀌면 서브클래스를 일일이 열어서 여러 군데를 고쳐야 한다.
④ 클래스 구조상 새로운 음료를 추가하려면 꽤 많은 일을 해야 한다.
⑤ 알고리즘에 대한 지식과 구현 방법이 여러 클래스에 분산되어 있다.

템플릿 메소드 패턴을 사용하였을 때

① CaffeiineBevrage클래스에서 작업을 처리한다. 알고리즘을 혼자 독점하고 있다.
② CaffeineBeverage 덕분에 서브클래스에서 코드를 재사용할 수 있다.
③ 알고리즘은 한 군데에 모여 있기 때문에 그 부분만 고치면 된다.
④ 템플릿 메소드 패턴을 사용하는 버전에서는 다른 카페인 음료도 쉽게 추가할 수 있는 프레임워크를 제공한다. 카페인 음료를 추가할 때 몇 가지 메소드만 추가하면 된다.
⑤ CaffeineBeverage 클래스에 알고리즘에 대한 지식이 집중되어 있으며 일부 구현만 서브클래스에 의존한다.