Notice
suyeonme
[디자인패턴] 템플릿 메소드 패턴(Template Method Pattern) 본문
헤드 퍼스트 디자인 패턴을 읽고 정리한 내용입니다.
템플릿 메소드 패턴(Template Method Pattern)이란?
템플릿 메소드 패턴은 즉 일련의 단계로 알고리즘을 정의한 메소드이다. 여러 단계중 하나 이상의 단계가 추상 메소드로 정의되며 그 추상 메소드는 서브 클래스에서 구현한다.
템플릿 메소드 패턴 구현
구현 순서
- prepareRecipe()는 어떤 알고리즘의 템플릿 역할을 한다. 템플릿 메소드는 서브 클래스에서 오버라이드하지 못하도록 final로 선언한다.
- 템플릿 메소드의 일부 알고리즘(추상 메소드)은 서브 클래스에서 구현한다.
public abstract CaffeineBeverage {
final void prepareRecipe() {
// 템플릿 메소드
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
//...
}
void pourInCup() {
//...
}
}
서브 클래스
public class Tea extends CaffeineBeverage {
public void brew() {
System.out.println("찻잎을 우려내는 중");
}
public void addCondiments() {
System.out.println("레몬을 추가하는 중");
}
}
public class Coffee extends CaffeineBeverage {
public void brew() {
System.out.println("커피를 우려내는 중");
}
public void addCondiments() {
System.out.println("우유를 추가하는 중");
}
}
후크(Hook)란?
- 추상 클래스에서 선언되지만 기본적인 내용만 구현되어있거나 아무 코드도 들어있지 않은 메소드이다.
- 서브 클래스는 후크를 사용하며 다양한 위치에서 알고리즘에 끼어들 수 있다.
후크 예시
추상 클래스
public abstract CaffeineBeverage {
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
if(customerWantsCondiments) { // hook!
addCondiments();
}
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
//...
}
void pourInCup() {
//...
}
boolean customerWantsCondiments() {
return true;
}
}
서브 클래스
public class Tea extends CaffeineBeverage {
public void brew() {
System.out.println("찻잎을 우려내는 중");
}
public void addCondiments() {
System.out.println("레몬을 추가하는 중");
}
public boolean customerWantsCondiments() {
String answer = getUserInput();
return answer.toLowerCase().startsWith("y") ? true : false;
}
private String getUserInput() {
String answer = null;
System.out.print("커피에 설탕과 우유를 넣을까요? (y/n)");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
try {
answer = in.readLine();
} catch(IOException ioe) {
System.err.println("IO ERROR");
}
if(answer == null) {
return "no";
}
return answer;
}
}
'프로그래밍👩🏻💻 > 디자인 패턴' 카테고리의 다른 글
[디자인패턴] 상태 패턴(State Pattern) (0) | 2022.08.09 |
---|---|
[디자인 패턴] 반복자 패턴(Iterator Pattern) (0) | 2022.08.09 |
[디자인패턴] 상속(Inheritance) vs 조합(Composition) (0) | 2022.07.17 |
[디자인 패턴] 최소 지식 원칙(Principle of Least Knowledge) (0) | 2022.07.11 |
[디자인 패턴] 어댑터 패턴(Adapter Pattern), 퍼사드 패턴(Facade Pattern) (0) | 2022.07.11 |
Comments