* 개요
오브젝트에서 변하는 부분과 변하지 않는 부분을 구분하고, 변하는 부분을 특정 알고리즘 군으로 정의하고 알고리즘 군을 캡슐화 하여, 교환해서 사용할 수 있도록 한다.
Strategy Pattern 을 사용하면 Client 와는 별개로 알고리즘을 변경할 수 있다.
Template Method Pattern 이 상속을 이요하여 변하는 부분을 처리했다면, Strategy Pattern 은 구성을 이용한다. Strategy Pattern 은 변하는 부분을 인터페이스로 분리하여, 그 구현체를 변경함으로써 로직을 변경한다. Template Method Pattern 에서는 공개되는 부분이 template method 를 가지고 있는 class 이지만, Strategy Pattern 에서 공개되는 부분은 인터페이스를 사용하는 클래스(Context라 명)이다.
* 구조
- Strategy : 모든 교체가능한 전략들을 위한 interface 를 선언. Context 는 strategy를 사용한다.
- ConcreteStrategy : 각각의 알고리즘을 구현
- Context : strategy 에 대한 reference 를 가지고, ConcreteStrategy 가 설정됨.
* Sample
2012. 2. 26.
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
상속을 통해 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)
Sub2)
Sub1)
package pattern.TemplateMethod; |
public class Sub1 extends Super { |
@Override |
public void abstractMethod() { |
// do something |
} |
@Override |
protected void hookMethod() { |
// do something |
} |
} |
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()의 구현
피드 구독하기:
글 (Atom)