2012. 2. 23.

Template Method Pattern

* 개요
 
상속을 통해 SuperClass 의 기능을 확장할 때 사용하는 가장 대표적인 방법이다. 
변하지 않는 기능은 SuperClass 에 만들어 두고, 자주 변경되어 확장할 기능은 SubClass에서 만들도록 한다.
SuperClass 에서는 미리 abstract method 혹은 override 가능한 method 를 정의해 두고, 이를 활용해 코드의 기본 알고리즘을 담고 있는 Template method 를 만든다. SuperClass에서 디폴트 기능을 정의해 두거나 비워뒀다가 SubClass 에서 선택적으로 Override 할 수 있도록 만들어 둔 method 를 hook method 라고 한다. 
SubClass 에서는 abstract method  를 구현하거나,  hook method를 override 하는 방법을 이용해 기능의 일부를 확장한다.

* Sample

1. SuperClass
package pattern.TemplateMethod;
public abstract class Super {
    public final void templateMethod() {
        // do something
        hookMethod();
        // do something
        abstractMethod();
        // do something
    }
    protected void hookMethod() {}
    public abstract void abstractMethod();
}
- 기본 알고리즘 골격을 담은 method  를 template method 라고 부른다. 
- template method는 SubClass 에서 override 하거나 구현할 method 를 사용한다.
- template method는 하위 Class에서 override 하지 못하도록 final 로 설정하는 경우가 많으나, SubClass 가 templeMethod를 Overriding 할수 있도록 final 을 사용하지 않을 수도 있다.
- 주로 SubClass에서 구현하는 method들은 templateMethod에서 사용되는 경우가 대부분이고, 별도로 호출되어 사용되지 않는 경우가 많아 대부분 protected 로 선언된다.


2. SubClass
Sub1)
package pattern.TemplateMethod;
public class Sub1 extends Super {
    @Override
    public void abstractMethod() {
        // do something
    }
    @Override
    protected void hookMethod() {
        // do something
    }
}
Sub2)
package pattern.TemplateMethod;
public class Sub2 extends Super {
    @Override
    public void abstractMethod() {
        // do something
    }
}
SubClass 에서는 hookMethod 나 abstractMethod를 구현한다.


* Template Method 사용시 유의점

- 상속을 기본으로 하기 때문에 SuperClass의 변경이 있는 경우(예를들면 abstract method의 추가등), SubClass 들에 모두 영향을 줄수 있다. 따라서 SuperClass 를 설계시에 신중해야 한다.
- SubClass에서 구현한 항목들은 대부분 templateMethod 에서 호출되어 사용되므로 SubClass 입장에서는 언제 어떻게 호출되어사용되는지 추적이 어렵다.




* 대표적 사용 예

- Servlet 작성 시 HttpServlet 의 doGet(), doPost()의 구현






댓글 없음:

댓글 쓰기