객체의 연산에는 알고리즘의 뼈대만을 정의하고, 각 단계에서 수행할 구체적인 처리는 서브 클래스 쪽으로 미룬다.
팩토리 메소드 패턴과 매우 유사하다.
ConcreteClass는 AbstractClass를 통하여 알고리즘의 변하지 않는 처리 단계를 구현한다.
오늘도 Pizza를 예제로 만들어보았다.
AbstractPizzaClass 를 만들었고, 피자 제조 공정은 prepare, addTopping, add cheese,package 4가지 공정이 있다고 가정한다.
그중에서 addTopping과 add Cheese 공정은 각 분점에서 알아서 하게끔 하고 싶을 때 template method Pattern에 위임한다는 점
AbstractPizzaClass
public abstract class AbstractPizzaClass {
// protected 선언이 일반적
protected abstract void doAddTopping();
protected abstract void doAddCheese();
private void preparePizza() {
System.out.println("Prepare Pizza");
}
private void packagingPizza() {
System.out.println("Packaging Pizza");
}
// Template Method. 큰 틀은 부모가 정해놓고, 세부 공정은 Concrete가 하도록 abstract class로 구현
public void templateMethod() {
preparePizza();
addTopping();
addCheese();
packagingPizza();
}
}
// 구체적인 행동(addTopping, addCheese 메소드만 정의하고 나머지는 부모에게 맡김)
public class SeoulPizzaClass extends AbstractPizzaClass {
@Override
protected void doAddTopping() {
System.out.println("add Seoul Pizza Topping");
}
@Override
protected void doAddCheese() {
System.out.println("add Seoul Cheese Topping");
}
}