* 개요
상속을 통해 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() { |
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 { |
public void abstractMethod() { |
protected void hookMethod() { |
Sub2)
package pattern.TemplateMethod; |
public class Sub2 extends Super { |
public void abstractMethod() { |
SubClass 에서는 hookMethod 나 abstractMethod를 구현한다.
* Template Method 사용시 유의점
- 상속을 기본으로 하기 때문에 SuperClass의 변경이 있는 경우(예를들면 abstract method의 추가등), SubClass 들에 모두 영향을 줄수 있다. 따라서 SuperClass 를 설계시에 신중해야 한다.
- SubClass에서 구현한 항목들은 대부분 templateMethod 에서 호출되어 사용되므로 SubClass 입장에서는 언제 어떻게 호출되어사용되는지 추적이 어렵다.
* 대표적 사용 예
- Servlet 작성 시 HttpServlet 의 doGet(), doPost()의 구현
댓글 없음:
댓글 쓰기