본문 바로가기
SW

GoF의 디자인 패턴(Design Patterns: Elements of Reusable Object-Oriented Software) - 5장 행동패턴 :: 템플릿 메서드(Template Method)

by 라꾸스떼(YR) 2020. 5. 13.
반응형

[템플릿 메서드(Template Method) - 클래스 행동]

<의도>

알고리즘의 구조 자체는 그대로 놔둔 채 알고리즘 각 단계 처리를 서브클래스에서 재정의할 수 있게 한다.

<동기>

특정한 요구나 때에 따라서 프레임워크가 정의한 Application 클래스와 Document 클래스를 상속한 서브클래스를 정의하여 새로운 응용프로그램을 구축할 수 있다.

템플릿 메서드는 서브클래스가 오버라이드할 수 있는 추상 연산을 사용하여 알고리즘을 정의한다. 처리가 구체적으로 어떻게 되는지는 Application 클래스의 서브클래스가 정의한다. 추상 연산을 통해서 알고리즘의 일부 단계를 정의함으로써, 템플릿 메서드는 각 단계의 순서는 고정하되 Application 클래스와 Document 클래스의 서브클래스는 필요에 따라 이들 단계의 처리를 다양화시킬 수 있도록 한다.

<활용성>

-어떤 한 알고리즘을 이루는 부분 중 변하지 않는 부분을 한 번 정의해 놓고 다양해질 수 있는 부분은 서브클래스에서 정의할 수 있도록 남겨두고자 할 때

-서브클래스 사이의 공통적인 행동을 추출하여 하나의 공통 클래스에 몰아둠으로써 코드 중복을 피하고 싶을 때. “일반화를 위한 래픽토링”

-서브클래스의 확장을 제어

<구조>

<참여자>

-AbstractClass: 서브클래스들이 재정의를 통해 구현해야 하는 알고리즘 처리 단계 내의 기본 연산을 정의한다. 그리고 알고리즘의 뼈대를 정의하는 템플릿 메서드를 구현한다.

-ConcreteClass: 서브클래스마다 달라진 알고리즘 처리 단계를 수행하기 위한 기본 연산을 구현한다.

<협력 방법>

ConcreteClass는 AbstractClass를 통하여 알고리즘의 변하지 않는 처리 단계를 구현한다.

<결과>

템플릿 메서드는 코드 재사용을 위한 기본 기술이다.

“할리우드 원칙(Hollywood Principle)” : Don’t call us, We’ll call you

부모 클래스는 서브클래스에 정의된 연산을 호출할 수 있지만 반대 방향의 호출은 안된다.

템플릿 메서드는 여러 종류의 연산 중 하나를 호출한다.

-구체 연산:ConcreteClass나 사용자 클래스에 정의된 연산

-AbstractClass 구체 연산:서브클래스에서 일반적으로 유용한 연산

-기본 연산:추상화된 연산

-팩토리 메서드

-훅 연산(Hook Operation):필요하다면 서브클래스에서 확장할 수 있는 기본 행동을 제공하는 연산. 기본적으로는 아무 내용도 정의하지 않는다.

템플릿 메서드 패턴에서는 어떤 연산이 훅 연산인지(오버라이드가 가능한지) 추상연산인지(꼭 오버라이드해야 하는지)를 지정해 두는 것이 대단히 중요하다.

<구현>

1.C++의 접근 제한 방법을 이용한다. C++로 구현할 때, 템플릿 메서드에서 호출하는 기본 연산들을 protected 멤버로 구현한다. 오버라이드해야 하는 기본 연산은 반드시 순수 가상 함수로 정의한다.

2.기본 연산의 수를 최소화한다.

3.이름을 짓는 규칙을 만든다. 재정의가 필요한 연산은 식별이 잘 되도록 접두사를 붙이는 것이 좋다.

<예제 코드>

<잘 알려진 사용예>

템플릿 메서드는 거의 모든 추상 클래스에서 사용할 정도로 필수적이고 기본적인 패턴이다.

<관련 패턴>

팩토리 메서드 패턴은 종종 템플릿 메서드 패턴이라고도 한다.

템플릿 메서드 패턴은 상속을 이용하여 다양한 알고리즘을 만들어 낸다. 이점은 전략 패턴과 관계가 있으며, 각 전략들은 위임을 통하여 전체 알고리즘을 다양화한다.

반응형

댓글