템플릿 메소드 패턴은 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래스에서 재정의한다.
템플릿 메소드 패턴의 구성 요소
- AbstractClass (추상 클래스)
- 알고리즘의 템플릿을 정의하는 클래스로, 템플릿 메소드를 포함하고 있다.
- 템플릿 메소드는 알고리즘의 구조를 정의하고, 일부 단계는 추상 메소드나 구현된 메소드를 활용하여 구현한다.
- 훅(Hook)을 사용하여 서브클래스에서 알고리즘의 특정 지점에 추가적인 동작을 삽입할 수 있다.
- ConcreteClass (구체 클래스)
- AbstractClass를 상속받아 템플릿 메소드에서 정의된 추상 메소드들을 구현하는 클래스이다.
- 알고리즘의 일부 단계를 재정의하여 구체적인 동작을 제공한다.
- 필요에 따라 후크를 오버라이딩하여 추가 동작을 삽입할 수 있다.
훅(Hook)의 사용
훅은 추상 클래스에서 비어있는 메소드이며, 서브클래스에서 필요에 따라 오버라이딩하여 사용할 수 있는 지점을 제공한다.
훅을 통해 서브클래스는 알고리즘의 중간 단계나 특정 지점에서 추가적인 동작을 삽입할 수 있다.
예제
// 음료를 만드는 알고리즘의 템플릿을 정의하는 클래스
abstract class BeverageTemplate {
// 템플릿 메소드: 알고리즘의 구조를 정의
final void makeBeverage() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) {
addCondiments();
}
}
// 일부 단계는 추상 메소드로 선언하여 서브클래스에서 구현
abstract void brew();
abstract void addCondiments();
// 구현된 후크 메소드
void boilWater() {
System.out.println("물 끓이는 중");
}
void pourInCup() {
System.out.println("컵에 따르는 중");
}
// 선택적으로 오버라이드할 후크 메소드
boolean customerWantsCondiments() {
return true;
}
}
// 추상 클래스를 상속받아 구체적인 동작을 구현하는 클래스
class Coffee extends BeverageTemplate {
@Override
void brew() {
System.out.println("커피를 내리는 중");
}
@Override
void addCondiments() {
System.out.println("설탕과 우유를 추가하는 중");
}
// 후크 메소드를 오버라이드하여 선택적으로 동작을 변경
@Override
boolean customerWantsCondiments() {
String answer = getUserInput();
return answer.toLowerCase(Locale.ROOT).equals("y");
}
private String getUserInput() {
Scanner scanner = new Scanner(System.in);
System.out.println("커피에 우유와 설탕을 넣을까요? (y/n)");
return scanner.next();
}
}
// 클라이언트
public class Client {
public static void main(String[] args) {
// Coffee를 만드는 알고리즘 수행
BeverageTemplate coffee = new Coffee();
coffee.makeBeverage();
}
}
728x90
'디자인 패턴' 카테고리의 다른 글
State Pattern (0) | 2024.06.15 |
---|---|
Singletone Pattern (0) | 2024.06.15 |
Proxy Pattern (0) | 2024.06.15 |
Observer Pattern (0) | 2024.05.30 |
Mediator Pattern (0) | 2024.05.28 |