의도
객체의 연산에는 알고리즘의 뼈대만을 정의하고 각 단계에서 수행할 구체적 처리는 서브클래스 쪽으로 미룹니다. 알고리즘의 구조 자체는 그대로 놔둔 채 알고리즘 각 단계 처리를 서브클래스에서 재정의할 수 있게 합니다.
활용성
- 어떤 한 알고리즘을 이루는 부분 중 변하지 않는 부분을 한 번 정의해 놓고 다양해질 수 있는 부분은 서브클래스에서 정의할 수 있도록 남겨두고자 할 때
- 서브클래스 사이의 공통적인 행동을 추출하여 하나의 공통 클래스에 몰아둠으로써 코드 중복을 피하고 싶을 때.
- 서브클래스의 확장을 제어할 수 있습니다. 탬플릿 메서드가 어떤 특정한 시점에 “훅(hook)” 연산을 호출하도록 정의함으로써, 그 특정 시점에서만 확장되도록 합니다.
구조
결과
템플릿 메서드는 코드 재사용을 위한 기본 기술입니다. 특히 클래스 라이브러리 구현 시 중요한 기술인데, 이는 라이브러리에 정의할 클래스들의 공통 부분을 분리하는 수단이기 때문입니다. 템플릿 메서드는 “할리우드 원칙(Hollywood principle)” 이라는 역전된 제어 구조를 끌어냅니다. “전화하지 마세요. 우리가 연락할게요.”. 다시 말해, 부모 클래스는 서브클래스에 정의된 연산을 호출할 수 있지만 반대 방향의 호출은 안 됩니다.
템플릿 메서드는 여러 종류의 연산 중 하나를 호출합니다.
- 구체 연산(concrete operation): ConcreteClass나 사용자 클래스에 정의된 연산
- AbstractClass 구체 연산: 서브클래스에서 일반적으로 유용한 연산
- 기본 연산: 추상화된 연산
- 팩토리 메서드
- 훅 연산(hook operation): 필요하다면 서브클래스에서 확장할 수 있는 기본 행동을 제공하는 연산. 기본적으로는 아무 내용도 정의하지 않습니다.
서브클래스 작성자는 어떤 연산들이 오버라이드용으로 설계되었는지를 정확하게 이해하고 있는 것이 매우 중요합니다.
구현
알아두면 좋을 구현 이슈를 정리해 보았습니다.
C++의 접근 제한 방법을 이용합니다.
protected, virtual 등의 접근 제한자를 활용합니다.
기본 연산의 수를 최소화합니다.
서브클래스가 알고리즘을 실체화하기 위해 오버라이드해야 하는 기본 연산의 개수를 최소화해야 합니다.
이름을 짓는 규칙을 만듭니다.
재정의가 필요한 연산은 식별이 잘 되도록 접두사를 붙이는 것이 좋습니다.
의견
java, C# 에서 제공하는 abstract 키워드를 사용하는 클래스, 메서드 등은 대부분 이런 템플릿 메서드를 구현하기 위해 사용된다.
참고
에릭 감마, 리처드 헬름, 랄프 존슨, 존 블리시디스. GoF의 디자인 패턴. 프로텍미디어 2015
GoF의 디자인 패턴 (Summary) 시리즈입니다.
- GoF의 디자인 패턴 (Summary) - 1
- GoF의 디자인 패턴 (Summary) - 2. 추상 팩토리(Abstract Factory)
- GoF의 디자인 패턴 (Summary) - 3. 팩토리 메서드(Factory Method)
- GoF의 디자인 패턴 (Summary) - 4. 단일체(Singleton)
- GoF의 디자인 패턴 (Summary) - 5. 적응자(Adapter)
- GoF의 디자인 패턴 (Summary) - 6. 복합체(Composite)
- GoF의 디자인 패턴 (Summary) - 7. 장식자(Decorator)
- GoF의 디자인 패턴 (Summary) - 8. 퍼사드(Facade)
- GoF의 디자인 패턴 (Summary) - 9. 감시자(Observer)
- GoF의 디자인 패턴 (Summary) - 10. 전략(Strategy)
- GoF의 디자인 패턴 (Summary) - 11 템플릿 메서드(Template Method)