Template는 언제든지 사용할 수 있는 매우 단순한 패턴이다.개발자가 부모 클래스를 작성하여 그것과 관련된 파생 클래스를 구현하도록 한 개 이상의 메소드를 작성해 놓을 때마다 실제로는Template패턴을 사용하고 있는 것이다.이 패턴은 클래스 안의 알고리즘을 정의하는 문제를 유형화하며,서브 클래스에서 구현되어야 할 세부 사항에 대해서는 관여하지 않는다.다시 말해서 개발자의 기본 클래스가abstract클래스인 경우Template패턴의 단순화된 형식을 사용하고 있는 것이다.디자인 패턴에서는 이 패턴의 명칭을Template Method패턴으로 정의해 놓았지만, Template패턴이라 부른다.
Template는 파생된 클래스에서 이용할 수 있는 네 가지의 메소드를 가지고 있다. A. 서브클래스들이 사용하고자 하는 모든 기본적인 기능을 수행하는 메소드를 완성한다.이런 것들은Concrete methods라 부른다. B. 전혀 채워 지지 않은 메소들은 파생 클래스에서 구현해야만 하나.자바에서는abstract메소드로 선언한다. C. 몇몇 연산에 대하여 기본적인 구현을 포함하는 메소드는 파생 클래스에서 재정의 될 수 있다.이런 것들을Hook메소드라 부른다.물론 이것은 임의적으로 만들 수 있다. D. 마지막으로Template클래스는 어떤 추상이나hook나 구체적인 메소드의 조합으로 그들 자체를 부를 수 있는 메소드를 포함할 수 있다. |
구조
|
역할
· AbstractClass: AbstractClass는 템플릿 메소드를 구현하고,템플릿 메소드에서 사용되고 있는 추상 메소드를 선언하는 역할을 합니다.이 추상 메소드는 하위 클래스인SpecificClass역할에 의해 구현된다.
· SpecificClass: AbstractClass역할에서 정의되어 있는 추상 메소드를 구체적으로 구현한다.
의도
구체적인 처리를 하위 클래스에게 위임하고 싶을 때.
적용시기
어떤 알고리즘의 변하지 않는 부분을 한번 정의 한 후 변할 수 있는 부분의 구현을subclass에서 하도록 할 때
결론
Template패턴은 모든 객체 지향 소프트웨어 개발에 사용될 수 있는데,그 의도는 전혀 복잡하거나 애매하지 않다.이 패턴은 객체 지향 프로그램밍은 일반적인 요소로서 해당 패턴이 실제로 작동하는 것 이상으로 사용하려고 해서는 안된다.
· 첫 번째 중요한 정점은 기본 클래스가 사용될 메소드의 일부만 정의할 수도 있으며,해당 메소드의 남은 부분은 파생 클래스에서 구현되도록 설정할 수있다는것이다.
· 두 번째 중요한 장점은 일련의메소드를 호출하는 기본 클래스의 메소드가 일부는 기본 클래스에서 구현되고,일부는 파생 클래스에서 호출될수 있다는 것이다. Template메소드는 일반알고리즘을 정의하는데,이것은 해당 알고리즘의 세부 사항이 기본 클래스에서는 완벽하게 수행되지 않는 내용이어도 진행된다.
· Template클래스는 종종 파생 클래스에서 재정의해야 하는abstract메소드를 보유하게된다.또한 필요할 때마다 자유롭게 재정의할 수 있는 단순한placeholder요소의 구현과 관련된 클래스를 보유할 수도 있다.이런placeholder클래스들이 기본 클래스의 다른 메소드에서 호출도리 경우 이런 재정의 가능한 메소드를“Hook메소드”라고 부른다.
예제소스
|
예제 소스
public abstract class AbstractDisplay { public abstract void open(); public abstract void print(); public abstract void close(); public final void display() { open(); for (int i = 0; i < 5; i++) { print(); } close(); } } public class CharDisplay extends AbstractDisplay { private char ch; public CharDisplay(char ch) { this.ch = ch; } public void open() { System.out.print("<<"); } public void print() { System.out.print(ch); } public void close() { System.out.println(">>"); } } public class StringDisplay extends AbstractDisplay { private String string; private int width; public StringDisplay(String string) { this.string = string; this.width = string.getBytes().length; } public void open() { printLine(); } public void print() { System.out.println("|" + string + "|"); } public void close() { printLine(); } private void printLine() { System.out.print("+"); for (int i = 0; i < width; i++) { System.out.print("-"); } System.out.println("+"); } } public class mainClass { public static void main(String[] args) { AbstractDisplay d1 = new CharDisplay('H'); AbstractDisplay d2 = new StringDisplay("Hello, world."); AbstractDisplay d3 = new StringDisplay("안녕하세요."); d1.display(); d2.display(); d3.display(); } } |
관련패턴
l Factory Method패턴: Template Method패턴을 인스턴스 생성에 응용한 전형적인 예가Factory Method패턴이다.
l Strategy패턴: Template Method패턴에서는 상위 클래스에서 프로그램의 큰 흐름을 정하고 하위 클래스에서 구체적인 해동을 정하기 때문에‘상속’을 이용해서 프로그램의 동작을 변경할 수있습니다.이에 비해Strategy패턴에서는 프로그램의 일부분을 변경한다기 보다는 알고리즘 전체를 교체하는 것이기 때문에‘위임’을 이용해서 프로그램의 동작을 변경할 수 있다.
'Programming > Design Pattern' 카테고리의 다른 글
[펌] The Observer Pattern (0) | 2006.01.21 |
---|---|
[펌] The State Pattern (0) | 2006.01.21 |
[펌] The Visitor Pattern (0) | 2006.01.21 |
[펌] The Interpreter Pattern (0) | 2006.01.21 |
[펌] The Iterator Pattern (0) | 2006.01.21 |