Template Method 패턴은 실행 순서(sequence)는 고정하면서 세부 실행 내용(operation)은 다양화 될 수 있는 경우에 사용하는 패턴이다.
구현 시 자주 발생하는 문제들 중에서 실행 순서가 고정되어야 하는 경우가 있다. 예를 들어 input() -> calculate() -> output() 순서에 따라서 실행되어야 하거나 init() -> do() -> release(), 또는 lock() -> do() -> unlock()과 같이 정확한 순서에 따라 실행되어야만 올바른 결과를 얻을 수 있는 경우가 있다. 이럴 때 보통 사용하는 방법은 외부에는 상세 단계들을 정해진 순서대로 실행시키는 함수를 public으로 제공하고, 각 단계를 실행하는 함수는 private으로 감춰 두는 것이다.
Template Method 패턴은 이것과 매우 유사한 방식이다. 다만, 실행 방법만 정해져 있을 뿐 각 순서에 따라 해야 할 일들이 서로 다를 수 있는 경우에 이 세부 순서를 구현할 수 있는 추상 메소드를 제공한다. 따라서 보통 Template Method 패턴은 추상 클래스로 구현되는 경우가 많다.
아래는 Template Method 패턴을 구현한 상위 클래스의 형식이다.
abstract public class AbstractTemplate {
public final void templateMethod(){
sequence1();
sequence2();
sequence3();
sequence4();
}
abstract protected void sequence1();
abstract protected void sequence2();
abstract protected void sequence3();
abstract protected void sequence4();
}
먼저 templateMethod()를 살펴보자. 이 패턴의 목적은 일단 순서를 고정하자는 것이다. 따라서 하위 클래스가 이 클래스를 상속 받은 후 templateMethod()를 재정의 하는 것을 방지하기 위해서 final 키워드를 사용해 주어야 한다. 그리고 설계상에서 이미 정해 놓은 순서를 내부적으로 구현한다. 각 순서를 메소드화 한 후, templateMethod() 에서 이 메소드들을 순서에 맞게 호출하는 것이다.
세부 메소드는 하위 클래스들이 구현할 수 있도록 abstract 함수로 제공한다. 이들 abstract 함수들은 templateMethod()에서 호출되어야 하므로 private이 아닌 protected로 선언되어야 한다.
세부 순서 함수 중 일부는 모든 하위 클래스에게 동일할 수 있다. 이 경우에는 상위 클래스가 이를 구현하고 하위 클래스들은 아예 볼 수 없도록 private으로 선언하는 편이 좋다.
'5.디자인패턴' 카테고리의 다른 글
Memento 패턴 (2) | 2016.09.13 |
---|---|
Bridge 패턴 (0) | 2016.09.13 |
Singleton 패턴 (0) | 2016.09.10 |
Builder 패턴 (0) | 2016.09.10 |
Holder 패턴 (0) | 2016.08.28 |