Template Method 패턴
개요
특정 기능을 수행하기 위한 처리 단계에 대한 기본 구조가 유사할 때 사용한다.
커피와 차를 만드는 방법을 보자
커피 요리법 | 차 요리법 |
---|---|
1. 물을 끓인다. | 1. 물을 끓인다. |
2. 끓는 물에 커피를 우린다. | 2. 끓는 물에 티백을 적신다. |
3. 컵에 따른다. | 3. 컵에 따른다. |
4. 설탕과 우유를 첨가한다. | 4. 레몬을 첨가한다. |
커피 요리법과 차 요리법은 매우 유사하다. 이를 이용하여 공통적인 부분을 묶는다면 유지보수성이 올라갈 수 있다.
코드
일단 따로따로 구성된 코드를 확인해보자.
class Coffee {
void prepareRecipe() {
boilWater();
brewCoffee();
pourInCup();
addSugarAndMilk();
}
private void addSugarAndMilk(){
}
private void pourInCup() {
}
private void brewCoffee() {
}
private void boilWater() {
}
}
class Tea {
void prepareRecipe() {
boilWater();
steepTeaBag();
pourInCup();
addLemon();
}
private void addLemon() {
}
private void steepTeaBag() {
}
private void pourInCup() {
}
private void boilWater() {
}
}
요리사 클래스는 각 커피 객체와, 차 객체를 하나씩 생성하고, 레시피 준비를 한다.
class Barista {
public void cook() {
Coffee coffee = new Coffee();
Tea tea = new Tea();
coffee.prepareRecipe();
tea.prepareRecipe();
}
}
위 전체적인 코드를 보면, 기능은 비슷하나 메소드가 다르게 정의되어 있어 전체적인 변경점이 있을 때 유지보수의 어려움을 겪을 수 있다.
Template Method 패턴을 적용한 코드를 보자
abstract class Beverage {
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
}
void pourInCup(){
}
}
커피와 차 클래스에서 차이를 보인 부분
은 우려내는 방법과, 후에 첨가하는 재료이다. 이는 각 클래스에서 따로 구현
하도록 정의하고, 공통적인
(물을 끓이는 방법과 컵에 따르는)부분
은 공통 클래스에서 구현
한다.
class Coffee extends Beverage{
public void addCondiments() {
}
public void brew() {
}
}
class Tea extends Beverage{
public void addCondiments() {
}
public void brew() {
}
}
결과
- 중복 코드를 최소화하여
코드 재사용을 극대화
한다. - final 키워드를 사용하여
코드 재정의를 방지
한다.
'이론적인거 > 디자인 패턴' 카테고리의 다른 글
[디자인 패턴] Observer 패턴 (0) | 2022.12.13 |
---|---|
[디자인 패턴] Adaptor 패턴 (0) | 2022.12.13 |
[디자인 패턴] Singleton 패턴 (0) | 2022.12.13 |
[디자인 패턴] 개요 (0) | 2022.12.13 |