[디자인패턴] 템플릿 메서드 패턴(Template Method Pattern)

2016. 11. 10. 11:12프로그래밍/디자인패턴

    목차

템플릿 메서드 패턴


정의

상위 클래스에서 처리의 흐름을 제어하며, 하위 클래스에서 처리의

내용을 구체화 한다.

여러 클래스에 공통되는 사항은 상위 추상 클래스에서 구현하고,

각각의 상세부분은 하위 클래스에서 구현한다.


코드의 중복을 줄이고, Refactoring에 유리한 패턴으로 상속을

통한 확장 개발 방법으로써 전략패턴(StrategyPattern)과 함께 

가장 많이 사용 되는 패턴중 한이다.



내용

- 고려사항
Template Method는 위험성을 어느 정도 내포하고 있습니다. 바로 전체적인 프로세스가 바뀌는 것입니다. 상위 클래스에서 변동이 일어날 경우 하위 클래스가 안전하리라는 보장은 할 수 없습니다. 상위 클래스에 abstract method가 하나만 추가되어도 모든 하위 클래스는 변경이 불가피합니다. 

나중에 발생하는 작은 변경이 큰 재난을 일으킬 수 있습니다. 이것은 상속이 가지는 위험성입니다.
그래서 Template Method 패턴을 사용할 때는 상위클래스에 대한 심사숙고가 반드시 필요합니다. 

일반적으로는 전체적인 프로세스를 담당하는 로직을 final 메쏘드로 정의하기도 하지만, 프로세스 자체의 변경을 고려해 상속의 여지를 남겨두기 위해 final 메쏘드로 정의하지 않기도 합니다.

또 한가지는 하위 클래스의 메쏘드들은 외부에서 직접 호출되지 않고 상위 클래스의 Template Method에서 호출됩니다. 그래서 주로 protected 로 선언됩니다. 

외부의 호출과 구체적인 구현체의 메서드가 실행 되기 까지 과정을 쉽게 파악하기가 어렵습니다. 

문제가 생겼을 때 추적이 어려울 수도 있다는 것이죠.


- 패턴 사용 용도

  • 구현 하려는 알고리즘이 일정한 프로세스가 있는 경우
  • 구현 하려는 알고리즘이 변경 가능성이 있는경우

템플릿 메소드 패턴은 "알고리즘의 뼈대"를 맞추는 것에 있습니다. 

즉, 전체적인 레이아웃을 통일 시키지만 상속받은 클래스로 하여금 어느정도 유연성을 주도록하는 디자인 패턴입니다.

추상 메소드(abstrcat method)와 훅 메소드(hook method)를 적절히 사용해서 전체적인 알고리즘의 뼈대를 유지하되 유연하게 기능을 변경할 수 있도록 하고자 할 때 사용하면 유용하겠네요.


- 패턴 구현 방법

  • 알고리즘을 여러 단계로 나눈다.
  • 알고리즘의 단계를 메서드로 선언한다.
  • 알고리즘을 수행 할 템플릿 메서드를 만든다.
  • 하위 클래스에서 나눠진 메서드를 구현한다.

- 예제 코드

여기에서는 토스트 메뉴를 통해 간단한 템플릿 메서드 패턴 코드를 보도록 하겠습니다.




햄치즈토스트




햄스페셜토스트




햄MVP토스트





각각의 클래스로 구현되어 있던 토스트들을 템플릿 메서드 패턴을 이용하여 재 구성 해보자.



공통적인 부분을 상위 토스트 클래스로 부터 상속을 통해 전체적인 레이아웃을 통일 시키지만 

자식 클래스 특성에 맞게 메인메뉴를 구현해 줌으로써 유연성을 주는 형태로 발전 했다.


참조