티스토리 뷰
Template패턴
상위 클래스에서는 처리의 뼈대(program skeleton of analgorithm)를 결정하고, 하위 클래스에서는 구체적인 내용을 결정한다. -> 의존성 부패(dependency rot) 문제를 방지
Concrete Method: Template 메소드가 정의된 클래스에 완전히 정의되는 메소드로 하위 클래스에서는 재정의하지 않아야 하는 연산. 다른 말로 complete method라 함 (자바에서 final 키워드로 수식) Abstract Method: - 하위에서 반드시 정의 Template 메소드가 정의된 클래스에 선언만 되어 있는 추상 메소드로 하위 클래스에서 반드시 정의하여야 하는 연산 Hook Method: - 선택적 정의 Template 메소드가 정의된 클래스에 기본 행동이 정의되어 있는 메소드로 하위 클래스에서 선택적으로 재정의할 수 있는 연산 |
Template패턴을 위한 2가지 (is-a, has-a)
예)
1. is-a
public abstract class CaffeineBeverage {
public final void PrepareRecipe() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments())
addCondiment();
}
public void boilWater() {
System.out.println("물 끓이는 중");
}
public void pourInCup() {
System.out.println("컵에 따르는 중");
}
public boolean customerWantsCondiments() {
return true;
}
public abstract void brew();
public abstract void addCondiment();
}
public class Coffee extends CaffeineBeverage {
@Override
public void brew() {
System.out.println("우려내는 중");
}
@Override
public void addCondiment() {
System.out.println("설탕과 프림을 추가");
}
}
Coffee클래스가 abstract 클래스인 CaffeineBeverage를 상속받아 brew와 addCondiment를 정의합니다.
2. has-a
public class CaffeineBeverage {
private CoffeeStrategy coffee;
public CaffeineBeverage(CoffeeStrategy coffee) {
this.coffee = coffee;
}
public final void PrepareRecipe() {
boilWater();
coffee.brew();
pourInCup();
if (customerWantsCondiments())
coffee.addCondiment();
}
public void boilWater() {
System.out.println("물 끓이는 중");
}
public void pourInCup() {
System.out.println("컵에 따르는 중");
}
public boolean customerWantsCondiments() {
return true;
}
}
has-a를 구현하기위해서는 Strategy패턴을 적용한다.
인터페이스
public interface CoffeeStrategy {
public void brew();
public void addCondiment();
}
클래스
public class Coffee implements CoffeeStrategy {
@Override
public void brew() {
System.out.println("우려내는 중");
}
@Override
public void addCondiment() {
System.out.println("설탕과 프림을 추가");
}
}
* Factory 메소드 패턴: 전형적인 template 메소드 패턴
참고 : HeadFirst Design Patterns
'Paradigm > OOP' 카테고리의 다른 글
| [OOP] MVC패턴익히기 (0) | 2013.06.06 |
|---|---|
| [OOP] StatePattern (0) | 2013.05.28 |
| [OOP] AdapterPattern (0) | 2013.05.10 |
| [OOP] 초기화를 위한 Null Object (0) | 2013.04.27 |
| [OOP] CommandPattern 구현해보기 (0) | 2013.04.27 |
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
- Total
- Today
- Yesterday