티스토리 뷰
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