템플릿 메서드 패턴이란, 여러 클래스에서 공통으로 사용되는 메서드를 템플릿화 하여 상위 클래스로 정의하고, 하위 클래스에서 세부 동작을 설정하는 행위 패턴이다.
즉, 변하지 않는 기능을 상위클래스에 정의(템플릿 메서드)하고 자주 변하는 기능을 하위 클래스에서 구현
템플릿이란, 변하지 않게 고정시켜놓는 것을 의미한다.
템플릿 메서드란, 상위 클래스에 작동시킬 메서드를 순서대로 정의한다.
이 순서대로 진행되는 로직속에서 변하지않는 메서드와 자주 변하는 메서드가 존재하고, 자주 변하는 메서드를 하위 클래스에서 정의한다.
최상위 객체의 템플릿 메서드를 제어하고 싶을때 사용하는 메서드
조건을 사용해서 템플릿 메서드의 흐름을 변경
AbstractTemplate 클래스(최상위 객체)
abstract class Beverage {
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) { // Hook 메서드 사용
addCondiments();
}
}
private void boilWater() {
System.out.println("물을 끓입니다.");
}
private void pourInCup() {
System.out.println("컵에 따릅니다.");
}
abstract void brew();
abstract void addCondiments();
// Hook 메서드: 기본적으로 첨가물을 추가하지 않음
boolean customerWantsCondiments() {
return true;
}
}
구현체 코드
class Coffee extends Beverage {
@Override
void brew() {
System.out.println("커피를 우려냅니다.");
}
@Override
void addCondiments() {
System.out.println("설탕과 우유를 추가합니다.");
}
@Override
boolean customerWantsCondiments() {
return true; // 커피는 기본적으로 첨가물을 추가
}
}
class Tea extends Beverage {
@Override
void brew() {
System.out.println("차를 우려냅니다.");
}
@Override
void addCondiments() {
System.out.println("레몬을 추가합니다.");
}
@Override
boolean customerWantsCondiments() {
return false; // 차는 기본적으로 첨가물을 추가하지 않음
}
}
public class Main {
public static void main(String[] args) {
Beverage coffee = new Coffee();
coffee.prepareRecipe(); // 커피는 첨가물을 추가
Beverage tea = new Tea();
tea.prepareRecipe(); // 차는 첨가물을 추가하지 않음
}
}