2011년 5월 23일 월요일

The Template Pattern

22. The Template Pattern
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();
}
}


관련패턴
  • Factory Method 패턴: Template Method 패턴을 인스턴스 생성에 응용한 전형적인 예가 Factory Method 패턴이다.
  • Strategy 패턴 : Template Method 패턴에서는 상위 클래스에서 프로그램의 큰 흐름을 정하고 하위 클래스에서 구체적인 해동을 정하기 때문에 ‘상속’을 이용해서 프로그램의 동작을 변경할 수있습니다. 이에 비해 Strategy 패턴에서는 프로그램의 일부분을 변경한다기 보다는 알고리즘 전체를 교체하는 것이기 때문에 ‘위임’을 이용해서 프로그램의 동작을 변경할 수 있다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...