Intent
- 알고리즘의 뼈대를 추상 클래스의 Final Method로 정의 - 템플릿 메소드
- 구체적인 실행 로직은 템플릿을 상속/ 구현 하여 Subclass에서 구현
Implementation

AbstractClass
- templateMethod에 자식에게 구현을 위임한 primitiveOperationX를 열심히 써서 구현
ConcreteClass
- primitiveOperationX를 열심히 구현 (override) 해서 부모의 메서드인 templateMethod를 완성함
Applicablity
- 알고리즘의 변하지 않는 파트를 한번 구현하고 하위 클래스에게 다양하게 변할 수 있는 구체 로직의 정의를 위임하고 싶을때
- 리팩토링을 했더니 클래스간에 공통 작업이 들어 났을 경우 템플릿 메소드 패턴을 통해 코드를 줄일수 있다.
Examples
로거 클래스의 경우 구체적인 로깅 방식은 하위클래스에게 위임하고 템플릿 메서드에서는 일단 로그를 찍는 로직만 계속 호출 할 수도 있다.
Specific problems & Implementation
Template method can not be overridden
- 템플릿 메소드를 final로 지정해줘서 재정의 될 수 없도록하자
Concrete base class
- Base class가 Abstract하지 않을 수도 있다. Base Class를 구체 클래스로 제공해서 일종의 Default 처럼 동작하게 할 수 있다.
- 이경우 Subclass에 구현을 위임하고자 하는 메서드에 abstract 키워드를 달 수 없기 때문에 Base class 작성자의 의도가 명확하게 드러나지 않을 수 있다는 단점이 있다.
Customization Hooks
- Customization Hooks를 활용해서 Base class 작성자의 의도를 명확하게 드러낼 수 있다. -??? 어떻게??? 봐도 모르겠음
Minimizing primitive methods number
- 위임하는 메서드인 primitive methods의 개수를 줄이자.
Naming Conventions
- primitive methods prefix - “do”
- customization hooks prefix - “pre,” , “post”