☕ JAVA
[Java] 템플릿 메서드 패턴(Template Method Pattern)
별이⭐
2024. 5. 31. 23:16
템플릿 메서드 패턴(Template Method Pattern)
- 템플릿 메서드 패턴은 디자인 패턴 중 하나로, 알고리즘의 구조를 메서드에 정의하고, 알고리즘의 일부 단계를 서브 클래스에서 구현하도록 하여 알고리즘의 일부 변경을 허용하는 패턴이다.
- 이러한 패턴은 특히 공통의 알고리즘 과정이 있지만, 그 과정 중 일부가 클래스마다 다를 때 유용하다.
- 추상 클래스를 사용해 템플릿 메서드를 정의하고, 구체적인 작업은 서브 클래스에서 오버라이드하여 구현한다.
템플릿 메서드 패턴의 구조
- 추상 클래스(abstract class)
- 알고리즘의 단계를 정의하는 템플릿 메서드와 알고리즘의 일부를 구현하는 하나 이상의 추상 메서드로 구성된다.
- 구체 클래스(concrete class)
- 추상 클래스를 상속받아 추상 메서드를 구현한다. 이를 통해 알고리즘의 일부 단계를 구체화한다.
예시) 커피와 차 준비하기
BeverageRecipe
는 커피와 차 준비의 공통 알고리즘을 정의한 추상 클래스이다.prepareRecipe
메서드는 알고리즘의 구조를 정의하는 템플릿 메서드이다.brew
와addCondiments
는 서브 클래스에서 구현되는 추상 메서드이다.- 이렇게 하면 기본 알고리즘 구조를 변경하지 않고도 알고리즘의 일부 단계를 다양하게 구현할 수 있다.
- 추상 클래스 정의하기
public abstract class BeverageRecipe {
// 템플릿 메서드
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("컵에 따릅니다.");
}
}
- 구체 클래스 구현하기
public class Coffee extends BeverageRecipe {
@Override
void brew() {
System.out.println("필터를 통해 커피를 우려냅니다.");
}
@Override
void addCondiments() {
System.out.println("설탕과 우유를 추가합니다.");
}
}
public class Tea extends BeverageRecipe {
@Override
void brew() {
System.out.println("차를 우려냅니다.");
}
@Override
void addCondiments() {
System.out.println("레몬을 추가합니다.");
}
}
- 사용 예제
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
BeverageRecipe tea = new Tea();
tea.prepareRecipe();
BeverageRecipe coffee = new Coffee();
coffee.prepareRecipe();
}
}