- 상속을 통한 슈퍼클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법이다.
- 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴이다.
- 변하지 않는 기능은 슈퍼클래스에 만들어주고 자주 변경되며 확장할 기능은 서브 클래스에서 만든다.
- 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화 할 때 유용하다.
public class TemplateMethodPatternClient {
public static void main(String[] args) {
AbstractClass abstractClass = new ConcreteClass();
abstractClass.templateMethod();
}
}
public abstract class AbstractClass {
protected abstract void hook1();
protected abstract void hook2();
public void templateMethod() {
hook1();
hook2();
}
}
public class ConcreteClass extends AbstractClass {
@Override
protected void hook1() {
System.out.println("ABSTRACT hook1 implementation");
}
@Override
protected void hook2() {
System.out.println("ABSTRACT hook2 implementation");
}
}
-
역할
-
AbstractClass
- 템플릿 메소드를 정의하는 클래스
- 하위 클래스에 공통 알고리즘을 정의하고 하위 클래스에서 구현될 기능을 primitive 메소드 또는 hook 메소드로 정의하는 클래스
-
ConcreteClass
- 물려받은 primitive 메소드 또는 hook 메소드를 구현하는 클래스
- 상위 클래스에 구현된 템플릿 메소드의 일반적인 알고리즘에서 하위 클래스에 적합하게 primitive 메소드나 hook 메소드를 오바라이드하는 클래스
-
-
추상클래스인 AbstractClass 에는 실제로 실행을 위해 호출 될 public 메소드인 templateMethod가 있다.
-
templateMethod 내부에는 hook1 -> hook2 의 단계를 가지는 추상메소드가 호출된다.
-
추상메소드들은 AbstractClass 를 상속받아 구현한 ConcreteClass 에서 구체적인 구현이 정의된다.
- 템플릿 메소드 패턴 : 변하지 않는 기능은 슈퍼클래스에 만들어주고 자주 변경되며 확장할 기능은 서브 클래스에 작성하는 방법