템플릿 메소드(Template Method)에서는 알고리즘의 각 단계들을 정의하며, 그 중 한 개 이상의 단계가 서브클래스에 의해 제공될 수 있습니다.
아래 예시를 살펴보면 CaffeineBeverage
클래스에서 알고리즘을 독점하고 있는 것(prepareRecipe
)을 볼 수 있습니다. 그리고 이 알고리즘의 일부 구현만 서브 클래스에 의존합니다. 그래서 알고리즘은 한 군데에 있기 때문에 그 부분만 고치면 됩니다.
CaffeineBeverage.java
public abstract class CaffeineBeverage {
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
System.out.println("boiling water ...");
}
void pourInCup() {
System.out.println("pouring in cup ...");
}
}
Coffee.java
public class Coffee extends CaffeineBeverage {
@Override
void brew() {
System.out.println("brewing coffee ...");
}
@Override
void addCondiments() {
System.out.println("adding sugar and milk ...");
}
}
Head First Design Patterns의 책에서는 템플릿 메소드 패턴을 아래와 같이 정의하고 있습니다.
템플릿 메소드 패턴(Template Method Pattern)에서는 알고리즘의 골격을 정의합니다. 알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있습니다. 템플릿 메소드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브클래스에서 특정 단계를 재정의할 수 있습니다.
템플릿 메소드 패턴의 기본 구조는 아래와 같습니다.
final
로 지정하여 서브클래스에서 수정할 수 없도록 하였습니다.hook()
다양한 용도로 사용할 수 있습니다.hook()
reference codepublic abstract class AbstractClass {
final void templateMethod() {
primitiveOperation1();
primitiveOperation2();
concreteOperation();
hook();
}
abstract void primitiveOperation1();
abstract void primitiveOperation2();
final void concreteOperation() {}
void hook() {}
}
헐리우드 원칙
먼저 연락하지 마세요. 저희가 연락 드리겠습니다 .
헐리우드 원칙을 활용하면 "의존성 부패(dependency rot)"를 방지할 수 있습니다. 의존성이 복잡하게 꼬여있는 것을 의존성 부패라고 부릅니다. 의존성이 부패되면 시스템이 어떤 식으로 디자인된 것인지 거의 아무도 알아볼 수 없게 됩니다.
템플릿 메소드 패턴은 헐리우드 원칙을 적용한 패턴이라고 할 수 있습니다.