본문 바로가기
디자인패턴

탬플릿 메서드 패턴

by gamedevlab 2025. 5. 11.

알고리즘을 캡슐화 하는 것

커피 클래스, 홍차 클래스가 있다면

커피 만들기 알고리즘 : 물 끓이기, 끓는 물에 커피를 우려내기, 커피를 컵에 따르기, 설탕과 우유를 추가하기

홍차 만들기 알고리즘 : 물 끓이기, 끓는 물에 홍차를 우려내기, 홍차를 컵에 따르기, 레몬을 추가하기

알고리즘에 공통점이 아주 많다.

알고리즘을 캡슐화 하자. 공통 메서드는 그대로, 서브클래스별로 달라지는 메서드는 추상으로 넘기자.

 
  • 모든 자식 클래스는 추상 단계들을 구현해야 합니다.
  • 선택적 단계들에는 이미 어떤 디폴트​(기본값) 구현이 있지만, 필요한 경우 이를 무시하고 오버라이드​(재정의) 할 수 있습니다.

모든 메서드가 추상이여도 상관없다. 함부로 바꾸면 안되는 메소드들이 있다면 final로 선언하면 된다. 스트레티지도 똑같이 알고리즘을 캡슐화 하지만, 스트레티지는 구성을,탬플릿메서드는 상속을 이용한다.

팩토리 메서드 패턴도 특화된 탬플릿 메소드인데, 서브클래스로 넘기지 않고 기본 단계에서 객체를 생성하고 리턴한다.

서브클래스에게 몇 가지 알고리즘을 구현할 기회 를 제공한다는 것에 주목하면, 선택적인 메소드를 제공하는 것도 가능하다. 이걸 훅이라고 한다.

가방이나 물건에 달려있는 고리와 똑같은 것. 그냥 써도 되고, 필요하다면 거기에 뭔가 걸어서 확장시킬 수도 있다.

훅이라는 유형. 훅은 몸체가 비어 있는 선택적 단계입니다. 템플릿 메서드는 훅이 오버라이드 되지 않아도 작동합니다. 일반적으로 훅들은 알고리즘의 중요한 단계들의 전 또는 후에 배치되어 자식 클래스들에 알고리즘에 대한 추가 확장 지점들을 제공합니다.

사용해야 할 때

템플릿 메서드 패턴은 클라이언트들이 알고리즘의 특정 단계들만 확장할 수 있도록 하고 싶을 때, 그러나 전체 알고리즘이나 알고리즘 구조는 확장하지 못하도록 하려고 할 때 사용하세요. → 확장에는 열려있고 변경에는 닫혀있다.

템플릿 메서드는 모놀리식 알고리즘을 일련의 개별 단계들로 전환할 수 있도록 합니다. 이 알고리즘은 부모 클래스에서 정의된 구조를 그대로 유지하면서 자식 클래스들에 의해 쉽게 확장될 수 있습니다.

이 패턴은 약간의 차이가 있지만 거의 같은 알고리즘들을 포함하는 여러 클래스가 있는 경우에 사용하세요. 결과적으로 알고리즘이 변경되면 모든 클래스를 수정해야 할 수도 있습니다.

이러한 알고리즘을 템플릿 메서드로 전환하면 유사한 구현들이 있는 단계들을 부모 클래스로 끌어올릴 수 있으며, 그로 인해 코드 중복을 제거할 수 있습니다. 자식 클래스 중 서로 코드가 다른 부분들은 자식 클래스들에 남겨놓을 수 있습니다.

구현방법

  1. 대상 알고리즘을 분석하여 여러 단계로 나눌 수 있는지 확인하세요. 어떤 단계들이 모든 자식 클래스에 공통인지 또 어떤 단계들이 항상 고유한지를 고려하세요.
  2. 추상 기초 클래스를 만들고 알고리즘의 단계들을 표현하는 템플릿 메서드와 추상 메서드들의 집합을 선언하세요. 해당하는 단계들을 실행하여 템플릿 메서드에서 알고리즘의 구조의 윤곽을 잡으세요. 템플릿 메서드를 final로 만들어 자식 클래스들이 메서드를 오버라이드하지 못하도록 하는 것을 고려하세요.
  3. 모든 단계가 추상적이어도 괜찮습니다. 그러나 일부 단계들에는 디폴트 구현이 있는 것이 도움이 될 수 있습니다. 자식 클래스들은 이러한 디폴트 메서드들을 구현할 필요가 없습니다.
  4. 알고리즘의 중요한 단계들 사이에 훅들을 추가하는 것을 고려하세요.
  5. 알고리즘의 각 변형에서 새로운 구상 자식 클래스를 생성하세요. 새로운 구상 자식 클래스는 모든 추상 단계들을 반드시 구현해야 하지만 일부 선택 단계를 오버라이드할 수도 있습니다.

장단점

  • 클라이언트들이 대규모 알고리즘의 특정 부분만 오버라이드하도록 하여 그들이 알고리즘의 다른 부분에 발생하는 변경에 영향을 덜 받도록 할 수 있습니다.
  • 중복 코드를 부모 클래스로 가져올 수 있습니다.
  • 일부 클라이언트들은 알고리즘의 제공된 골격에 의해 제한될 수 있습니다.
  • 당신은 자식 클래스를 통해 디폴트 단계 구현을 억제하여 리스코프 치환 원칙을 위반할 수 있습니다. → 자식 객체가 부모 객체를 완전히 대체할 수 있어야 한다는 원칙.
  • 템플릿 메서드들은 단계들이 더 많을수록 유지가 더 어려운 경향이 있습니다.

다른 패턴과의 관계

  • 팩토리 메서드템플릿 메서드의 특수화라고 생각할 수 있습니다. 동시에 대규모 템플릿 메서드의 한 단계의 역할을 팩토리 메서드가 할 수 있습니다.
  • 템플릿 메서드는 상속을 기반으로 합니다. 이 메서드는 자식 클래스들에서 알고리즘의 부분들을 확장하여 변경할 수 있도록 합니다. 전략 패턴은 합성을 기반으로 합니다: 당신은 객체 행동의 일부분들을 이러한 행동에 해당하는 다양한 전략들을 제공하여 변경할 수 있습니다. 템플릿 메서드는 클래스 수준에서 작동하므로 정적입니다. 전략 패턴은은 객체 수준에서 작동하므로 런타임에 행동들을 전환할 수 있도록 합니다.
 

'디자인패턴' 카테고리의 다른 글

비지터 패턴  (0) 2025.05.11
플라이웨이트 패턴  (0) 2025.05.11
미디에이터 패턴  (1) 2025.05.11
파사드 패턴  (0) 2025.05.11
어댑터 패턴  (0) 2025.05.11