템플릿 메서드 패턴 (Template Method)
템플릿 메서드 패턴(Template Method Pattern)은 전체적인 알고리즘의 '뼈대(흐름)'는 부모(추상) 클래스에 정의하고, 단계별 '구체적인 구현'은 자식 클래스에게 위임하는 행위 패턴입니다.
커피와 홍차를 끓이는 과정을 보면 `1. 물 끓이기 -> 2. 우려내기 -> 3. 컵에 따르기 -> 4. 첨가물 넣기` 로 전체 흐름이 완벽히 똑같습니다. 이때 부모 클래스의 makeBeverage() 메서드 안에 이 4단계의 순서를 고정(final)해두고, 자식 클래스(Coffee, Tea)는 2번과 4번 내용만 알맞게 오버라이딩하여 코드 중복을 완전히 제거합니다.
// Abstract Class
abstract class CaffeineBeverage {
// 템플릿 메서드 (알고리즘의 골격)
// 하위 클래스에서 오버라이드 하지 못하게 final 선언
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
// 서브클래스에서 구현해야 할 메서드
abstract void brew();
abstract void addCondiments();
// 공통 메서드
public void boilWater() { System.out.println("물 끓이는 중"); }
public void pourInCup() { System.out.println("컵에 따르는 중"); }
}
class Tea extends CaffeineBeverage {
public void brew() { System.out.println("차를 우려냅니다"); }
public void addCondiments() { System.out.println("레몬을 추가합니다"); }
}
class Coffee extends CaffeineBeverage {
public void brew() { System.out.println("필터로 커피를 우려냅니다"); }
public void addCondiments() { System.out.println("설탕과 우유를 추가합니다"); }
}
public class Main {
public static void main(String[] args) {
CaffeineBeverage myTea = new Tea();
myTea.prepareRecipe();
System.out.println("---");
CaffeineBeverage myCoffee = new Coffee();
myCoffee.prepareRecipe();
}
}