템플릿 메소드 패턴은
- 알고리즘의 골격을 정의합니다.
- 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며,
- 알고리즘의 구조는 그대로 유지하면서 특정 단계를 서브클래스에서 재정의할 수도 있습니다.
커피와 홍차 예제
public abstract class CaffeineBeverage {
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
private void boilWater() {
//물 끓이기
}
private void pourInCup() {
//컵에 따르기
}
}
public class Coffee extends CaffeineBeverage{
@Override
void brew() {
System.out.println("필터로 커피를 우려내는 중");
}
@Override
void addCondiments() {
System.out.println("설탕과 우유를 추가하는 중");
}
}
public class Tea extends CaffeineBeverage{
@Override
void brew() {
System.out.println("찻잎을 우려내는 중");
}
@Override
void addCondiments() {
System.out.println("레몬을 추가하는 중");
}
}
예제
//추상 클래스로 선언되므로 서브클래스를 만들어야 함
public abstract class AbstractClass {
//템플릿 메소드
//알고리즘의 각 단계를 건드리지 못하게 final로 선언
final void templateMethod() {
primitiveOperation1();
primitiveOperation2();
concreteOperation();
hook();
}
//서브 클래스에서 구현
abstract void primitiveOperation1();
abstract void primitiveOperation2();
private void concreteOperation() {
// 메소드 코드
}
//구상 메소드이지만 기능 X -> 서브클래스에서 오버라이드 할 수도 있고, 그러지 않아도 괜찮음
private void hook() {
}
}
- primitiveOperation: 서브클래스에서 반드시 구현해야 함
- concreteOperation: 추상클래스에서 정의됨
- hook: 추상클래스에선 내용이 없고, 원한다면 서브 클래스에서 구현
할리우드 원칙
고수준 구성 요소 -> 저수준 구성 요소
"연락하지 마세요. 저희가 연락드리겠습니다."
의존성 부패(dependency rot)를 방지할 수 있음.
- CaffeineBeverage: 고수준 구성 요소
- Coffee, Tea: 저수준 구성 요소
참고
에릭 프리먼, 엘리자베스 롭슨, 케이시 시에라, 버트 베이츠. 『헤드퍼스트 디자인패턴 개정판』. 한빛미디어, 2022
'Design Pattern' 카테고리의 다른 글
상태 패턴 (State Pattern) (0) | 2023.11.06 |
---|---|
반복자 패턴 (Iterator Pattern) (0) | 2023.10.30 |
퍼사드 패턴 (Facade Pattern) (1) | 2023.10.24 |
어댑터 패턴 (Adapter Pattern) (0) | 2023.10.23 |
커맨드 패턴 (Command Pattern) (0) | 2023.09.27 |