상위 클래스(추상 클래스)에서 알고리즘의 구조를 정의 하고, 하위 클래스에서 세부적인 구현을 담당하도록 하는 디자인 패턴.
즉. 일부 동작은 고정된 템플릿(틀)으로 제공하고, 나머지는 하위 클래스가 구현하도록 한다.
작업에서 알고리즘의 골격을 정의하고, 일부 단계를 하위 클래스로 연기한다.
템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의 할 수 있다.
abstract메서드로 선언하여 하위 클래스에서 구현하도록 함.// 추상 클래스 (템플릿 메서드 포함)
public abstract class CoffeeTemplate {
// 템플릿 메서드 (알고리즘의 흐름을 정의)
public final void prepareCoffee() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) { // 훅(hook) 메서드
addCondiments();
}
}
// 공통적인 단계 (구현 제공)
private void boilWater() {
System.out.println("물을 끓인다.");
}
private void pourInCup() {
System.out.println("컵에 따른다.");
}
// 서브 클래스가 반드시 구현해야 하는 추상 메서드
protected abstract void brew();
protected abstract void addCondiments();
// 서브 클래스에서 선택적으로 오버라이드할 수 있는 훅 메서드
protected boolean customerWantsCondiments() {
return true;
}
}
// 아메리카노 클래스
public class Americano extends CoffeeTemplate {
@Override
protected void brew() {
System.out.println("에스프레소를 내린다.");
}
@Override
protected void addCondiments() {
System.out.println("추가적인 첨가물을 넣지 않는다.");
}
}
// 라떼 클래스
public class Latte extends CoffeeTemplate {
@Override
protected void brew() {
System.out.println("에스프레소를 내린다.");
}
@Override
protected void addCondiments() {
System.out.println("우유를 추가한다.");
}
}
// 카페모카 클래스 (훅 메서드를 이용한 예제)
public class CafeMocha extends CoffeeTemplate {
@Override
protected void brew() {
System.out.println("에스프레소를 내린다.");
}
@Override
protected void addCondiments() {
System.out.println("초콜릿 시럽과 우유를 추가한다.");
}
@Override
protected boolean customerWantsCondiments() {
return false; // 첨가물을 추가하지 않음
}
}
public class TemplateMethodExample {
public static void main(String[] args) {
System.out.println("===== 아메리카노 만들기 =====");
CoffeeTemplate americano = new Americano();
americano.prepareCoffee();
System.out.println("\n===== 라떼 만들기 =====");
CoffeeTemplate latte = new Latte();
latte.prepareCoffee();
System.out.println("\n===== 카페모카 만들기 =====");
CoffeeTemplate cafeMocha = new CafeMocha();
cafeMocha.prepareCoffee();
}
}
AbstractApplicationContext 클래스처럼 초기화 로직을 템플릿화 하여 서브 클래스가 확장하도록 만듦.