티스토리 뷰

Paradigm/OOP

[OOP] TemplatePattern

Mr.SIM 2013. 5. 13. 22:36

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