템플릿 메서드 패턴

Template method pattern

객체 지향 프로그래밍에서 템플릿 방법은 설계 패턴 에서 감마 등에 의해 식별된 행동 설계 패턴 중 하나입니다.[1]템플릿 메서드는 슈퍼클래스(일반적으로 추상 슈퍼클래스)의 메서드로, 다수의 상위 단계 관점에서 작업의 골격을 정의합니다.이러한 절차 자체는 템플릿 방식과 같은 클래스의 추가 도우미 메서드에 의해 구현됩니다.

도우미 메서드는 추상적메서드일 수 있습니다.이 경우 서브클래스는 구체적인 구현을 제공해야 합니다.또는 슈퍼클래스에 빈 바디가 있는 후크 메서드일 수도 있습니다.서브클래스는 후크 메서드를 덮어쓰고 동작을 커스터마이즈할 수 있습니다(필요하지는 않습니다).템플릿 메서드의 목적은 작업의 전체 구조를 정의하면서 하위 클래스가 특정 단계를 [2]세분화하거나 재정의할 수 있도록 하는 것입니다.

개요

이 패턴은 크게 다음 두 부분으로 구성됩니다.

  • "템플릿 메서드"는 기본 클래스(일반적으로 추상 클래스)의 메서드로 구현됩니다.이 메서드에는 전체 알고리즘에서 불변하는 부분의 코드가 포함되어 있습니다.템플릿에 의해, overarching 알고리즘이 항상 [1]준수되고 있는 것이 보증합니다.템플릿 방식에서는 다른 알고리즘의 일부가 추가 도우미 방식의 실행을 요구하는 셀프메시지를 송신함으로써 구현됩니다.기본 클래스에서는 이러한 도우미 메서드에 기본 구현이 제공되거나 전혀 구현되지 않습니다(즉 추상 메서드일 수 있습니다).
  • 기본 클래스의 하위 클래스는 "템플릿"의 빈 부분 또는 "변수" 부분을 하위 클래스에 따라 다른 [3]특정 알고리즘으로 채웁니다.서브클래스가 템플릿 메서드 자체를 덮어쓰지 않는 이 중요합니다.

런타임에 템플릿 방법으로 표현되는 알고리즘은 구체적인 서브클래스 중 하나의 인스턴스에 템플릿 메시지를 송신함으로써 실행된다.상속을 통해 기본 클래스의 템플릿 메서드 실행이 시작됩니다.템플릿 메서드가 도우미 메서드 중 하나를 자기 요구로 하는 메시지를 발송하면 메시지는 구체적인 서브인스턴스에 의해 수신됩니다.도우미 메서드가 덮어쓰기된 경우 하위 인스턴스의 덮어쓰기 구현이 실행됩니다. 덮어쓰기되지 않은 경우 기본 클래스의 상속된 구현이 실행됩니다.이 메커니즘에 의해 알고리즘 전체가 매번 같은 절차를 따르도록 할 수 있습니다.또, 알고리즘의 실행에 관한 원래의 요구를 수신한 인스턴스에 의해서, 몇개의 스텝의 상세를 결정할 수 있습니다.

이 패턴은 상위 수준의 코드에 의해 실행할 알고리즘이 결정되지 않고 런타임에 하위 수준의 알고리즘이 선택되기 때문에 제어 반전의 입니다.

템플릿 메서드에 의해 전송되는 셀프메시지 중 일부는 후크 메서드일 수 있습니다.이러한 메서드는 템플릿 메서드와 동일한 기본 클래스로 구현되지만 본문이 비어 있습니다(즉, 아무것도 하지 않습니다).후크 메서드는 서브클래스가 덮어쓸 수 있도록 존재하며 템플릿 메서드 자체를 덮어쓸 필요 없이 알고리즘의 액션을 미세 조정할 수 있습니다.바꿔 말하면, 배리언트 실장을 「행」하는 「훅」을 제공합니다.

구조.

UML 클래스 다이어그램

템플릿 방법 설계 [4]패턴에 대한 샘플 UML 클래스 다이어그램입니다.

위의 UML 클래스 다이어그램에서는AbstractClass를 정의합니다.templateMethod()행동의 골격(골격)을 정의하는 조작

  • 행동의 불변 부분을 구현하고
  • 자신에게 메시지 보내기primitive1()그리고.primitive2()이 명령어는 에 실장되어 있기 때문에SubClass1는, 그 서브 클래스에서 알고리즘의 이러한 부분의 배리언트 실장을 제공할 수 있도록 합니다.
LePUS3의 템플릿 [5]메서드.

사용.

템플릿 메서드는 사용자 지정을 위한 후크 메서드를 제공하면서 각각 도메인 아키텍처의 불변 부분을 구현하는 프레임워크에서 사용됩니다.이것은 컨트롤의 역전의 예입니다.템플릿 메서드는 다음과 같은 [3]이유로 사용됩니다.

  • 이를 통해 서브클래스는 (후크 [6]메서드의 덮어쓰기를 통해) 다양한 동작을 구현할 수 있습니다.
  • 코드의 중복을 회피합니다.알고리즘의 일반적인 워크플로우는 추상 클래스의 템플릿 메서드에서 한 번 구현되며 필요한 변형은 하위 [6]클래스에서 구현됩니다.
  • 전문화가 허용되는 지점을 제어합니다.서브클래스가 단순히 템플릿 메서드를 재정의하는 경우 워크플로우를 급진적이고 임의로 변경할 수 있습니다.반면 후크 방식만 재정의하면 워크플로우의 특정 상세 내역만 [6]변경할 수 있으며 전체 워크플로우는 그대로 유지됩니다.

코드 생성기와 함께 사용

템플릿 패턴은 자동 생성된 코드를 사용할 때 유용합니다.생성된 코드로 작업할 때의 문제는 소스 코드를 변경하면 생성된 코드가 변경된다는 것입니다. 생성된 코드에 수기 변경이 가해진 경우 소스 코드가 손실됩니다.그러면 생성된 코드를 어떻게 커스터마이즈해야 할까요?

템플릿 패턴은 해결책을 제공합니다.생성된 코드가 템플릿 메서드 패턴을 따를 경우 생성된 코드는 모두 추상 슈퍼클래스가 됩니다.손으로 쓴 커스터마이즈가 서브클래스로 한정되어 있는 경우, 이러한 변경을 덮어쓸 위험 없이 코드 생성기를 다시 실행할 수 있습니다.코드 생성과 함께 사용할 경우 이 패턴을 생성 간격 [7]패턴이라고 부르기도 합니다.

PHP 예시

추상적인 학급 게임 {     추상적인 보호되고 있다 기능. 초기화하다();     추상적인 보호되고 있다 기능. 시작 재생();     추상적인 보호되고 있다 기능. endPlay(재생 종료)();      /** 템플릿 메서드 */     일반의 최종 기능. 놀고()     {         /** 프리미티브*/         $ this->초기화하다();          /** 프리미티브*/         $ this->시작 재생();          /** 프리미티브*/         $ this->endPlay(재생 종료)();     } }  학급 마리오 확장 게임 {     보호되고 있다 기능. 초기화하다()     {         메아리치다 "Mario 게임 초기화 완료!연주 시작", PHP_EOL;     }      보호되고 있다 기능. 시작 재생()     {         메아리치다 "마리오 게임 시작"게임을 즐기세요!, PHP_EOL;     }      보호되고 있다 기능. endPlay(재생 종료)()     {         메아리치다 "마리오 게임 종료!", PHP_EOL;     }  }  학급 탱크파이트 확장 게임 {     보호되고 있다 기능. 초기화하다()     {         메아리치다 '탱크파이트 게임 시작!연주 시작", PHP_EOL;     }      보호되고 있다 기능. 시작 재생()     {         메아리치다 '탱크파이트 게임 시작'게임을 즐기세요!, PHP_EOL;     }      보호되고 있다 기능. endPlay(재생 종료)()     {         메아리치다 "탱크파이트 게임 종료!", PHP_EOL;     }  }  게임비 = 신규 탱크파이트(); 게임비->놀고();  게임비 = 신규 마리오(); 게임비->놀고(); 

C++의 예

#실패하다<iostream>  // 추상화 학급 베이스 클래스 {  보호되고 있다:  가상 무효 일부 방법() = 0; 일반의:  무효 ThisIsTemplateMethod() { 일부 방법(); } };  학급 Extended Class_1 : 일반의 베이스 클래스 { 보호되고 있다:  무효 일부 방법() 덮어쓰다 {   놓다([ Extended Class _ one ]여기서 메서드를 다시 정의합니다.);  } }; 학급 Extended Class_2 : 일반의 베이스 클래스 { 보호되고 있다:  무효 일부 방법() 덮어쓰다 {   놓다([ Extended Class _ two ]여기서 메서드를 다시 정의합니다.);  } };  인트 주된() {   베이스 클래스* 하나. = 신규 Extended Class_1;  하나.->ThisIsTemplateMethod();   베이스 클래스* 두명 = 신규 Extended Class_2;  두명->ThisIsTemplateMethod();   돌아가다 0; } 

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994). "Template Method". Design Patterns. Addison-Wesley. pp. 325–330. ISBN 0-201-63361-2.
  2. ^ Freeman, Eric; Freeman, Elisabeth; Sierra, Kathy; Bates, Bert (2004). Hendrickson, Mike; Loukides, Mike (eds.). Head First Design Patterns (paperback). Vol. 1. O'REILLY. pp. 289, 311. ISBN 978-0-596-00712-6. Retrieved 2012-09-12.
  3. ^ a b "Template Method Design Pattern". Source Making - teaching IT professional. Retrieved 2012-09-12. Template Method is used prominently in frameworks.
  4. ^ "The Template Method design pattern - Structure". w3sDesign.com. Retrieved 2017-08-12.
  5. ^ LePUS3 범례http://lepus.org.uk/ref/legend/legend.xml 에서 취득했습니다.
  6. ^ a b c Chung, Carlo (2011). Pro Objective-C Design Patterns for iOS. Berkeley, CA: Apress. p. 266. ISBN 978-1-4302-3331-2.
  7. ^ Vlissides, John (1998-06-22). Pattern Hatching: Design Patterns Applied. Addison-Wesley Professional. pp. 85–101. ISBN 978-0201432930.

외부 링크