Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В объектно-ориентированном программировании , то метод шаблона является одним из поведенческих шаблонов проектирования , определенного Gamma и др. [1] в книге Паттерны проектирования . Шаблонный метод - это метод в суперклассе, обычно абстрактном суперклассе, и определяет каркас операции с точки зрения количества шагов высокого уровня. Эти шаги сами по себе реализуются дополнительными вспомогательными методами в том же классе, что и шаблонный метод.

Эти вспомогательные методы могут быть как абстрактные методами , в этом случае подклассы , необходимые для обеспечения конкретных реализаций, или методов крючков , которые имеют пустые тела в суперклассе. Подклассы могут (но не обязаны) настраивать операцию, переопределяя методы ловушки. Цель метода шаблона - определить общую структуру операции, позволяя подклассам уточнять или переопределять определенные шаги. [2]

Обзор [ править ]

Этот паттерн состоит из двух основных частей:

  • «Шаблонный метод» реализован как метод в базовом классе (обычно в абстрактном классе ). Этот метод содержит код для инвариантных частей общего алгоритма. Шаблон гарантирует, что общий алгоритм всегда соблюдается. [1] В шаблонном методе части алгоритма, которые могут варьироваться , реализуются путем отправки собственных сообщений, которые запрашивают выполнение дополнительных вспомогательных методов. В базовом классе этим вспомогательным методам предоставляется реализация по умолчанию или вообще отсутствует (то есть они могут быть абстрактными методами).
  • Подклассы базового класса «заполняют» пустые или «вариантные» части «шаблона» особыми алгоритмами, которые варьируются от одного подкласса к другому. [3] Важно, чтобы подклассы не переопределяли сам метод шаблона.

Во время выполнения алгоритм, представленный методом шаблона, выполняется путем отправки сообщения шаблона экземпляру одного из конкретных подклассов. Через наследование начинает выполняться шаблонный метод в базовом классе. Когда шаблонный метод отправляет сообщение самому себе, запрашивая один из вспомогательных методов, сообщение будет получено конкретным суб-экземпляром. Если вспомогательный метод был переопределен, будет выполнена переопределяющая реализация в субэкземпляре; если он не был переопределен, будет выполнена унаследованная реализация в базовом классе. Этот механизм гарантирует, что весь алгоритм выполняет одни и те же шаги каждый раз, позволяя при этом детали некоторых шагов зависеть от того, какой экземпляр получил исходный запрос на выполнение алгоритма.

Этот шаблон является примером инверсии управления, потому что код высокого уровня больше не определяет, какие алгоритмы запускать; вместо этого во время выполнения выбирается алгоритм более низкого уровня.

Некоторые из собственных сообщений, отправляемых методом шаблона, могут быть перехватывающими методами. Эти методы реализованы в том же базовом классе, что и шаблонный метод, но с пустыми телами (т. Е. Они ничего не делают). Существуют методы-перехватчики, так что подклассы могут их переопределять и, таким образом, могут точно настраивать действие алгоритма без необходимости переопределения самого метода шаблона. Другими словами, они обеспечивают «крючок», на который можно «повесить» варианты реализации.

Структура [ править ]

Диаграмма классов UML [ править ]

Пример диаграммы классов UML для шаблона проектирования шаблонного метода. [4]

В приведенной выше UML - диаграмме классов , то AbstractClassопределяет templateMethod()операцию , которая определяет скелет (шаблон) из поведения по

  • реализация инвариантных частей поведения и
  • отправка себе сообщений primitive1()и primitive2(), которые, поскольку они реализованы SubClass1, позволяют этому подклассу предоставлять вариант реализации этих частей алгоритма.
Шаблонный метод в LePUS3 . [5]

Использование [ править ]

Метод шаблона используется во фреймворках, каждый из которых реализует инвариантные части архитектуры домена, предоставляя при этом методы перехвата для настройки. Это пример инверсии управления . Шаблонный метод используется по следующим причинам. [3]

  • Это позволяет подклассам реализовывать различное поведение (путем переопределения методов ловушки). [6]
  • Это позволяет избежать дублирования кода: общий рабочий процесс алгоритма реализуется один раз в методе шаблона абстрактного класса, а необходимые варианты реализуются в подклассах. [6]
  • Он контролирует точки, в которых разрешена специализация. Если бы подклассы просто переопределяли метод шаблона, они могли бы вносить радикальные и произвольные изменения в рабочий процесс. Напротив, при переопределении только методов перехвата могут быть изменены только некоторые конкретные детали рабочего процесса [6], а общий рабочий процесс остается нетронутым.

Использовать с генераторами кода [ править ]

Шаблон шаблона полезен при работе с автоматически сгенерированным кодом. Проблема работы с сгенерированным кодом заключается в том, что изменения в исходном коде приведут к изменениям в сгенерированном коде; если в сгенерированный код были внесены рукописные изменения, они будут потеряны. Как же тогда нужно настроить сгенерированный код?

Шаблон шаблона предлагает решение. Если сгенерированный код следует шаблону метода шаблона, весь сгенерированный код будет абстрактным суперклассом. При условии, что написанные вручную настройки ограничены подклассом, генератор кода можно запустить снова без риска перезаписать эти изменения. При использовании с генерацией кода этот шаблон иногда называют шаблоном разрыва генерации . [7]

Пример PHP [ править ]

абстрактный  класс  Game {  абстрактная  защищенная  функция  initialize ();  абстрактная  защищенная  функция  startPlay ();  абстрактная  защищенная  функция  endPlay (); / ** Шаблонный метод * /  public  final  function  play ()  {  / ** Примитивный * /  $ this -> initialize (); / ** Примитив * /  $ this -> startPlay (); / ** Примитивный * /  $ this -> endPlay ();  } }class  Mario  extends  Game {  protected  function  initialize ()  {  echo  "Mario Game Initialized! Начать играть." ,  PHP_EOL ;  } protected  function  startPlay ()  {  echo  "Игра Марио началась. Наслаждайтесь игрой!" ,  PHP_EOL ;  } protected  function  endPlay ()  {  echo  "Игра Марио завершена!" ,  PHP_EOL ;  }}class  Tankfight  extends  Game {  protected  function  initialize ()  {  echo  "Tankfight Game Initialized! Начать играть." ,  PHP_EOL ;  } защищенная  функция  startPlay ()  {  echo  "Tankfight Game Started. Наслаждайтесь игрой!" ,  PHP_EOL ;  } защищенная  функция  endPlay ()  {  echo  "Tankfight Game Finished!" ,  PHP_EOL ;  }}$ game  =  new  Tankfight (); $ игра -> играть ();$ game  =  новый  Марио (); $ игра -> играть ();

См. Также [ править ]

  • Наследование (информатика)
  • Переопределение метода (программирование)
  • GRASP (объектно-ориентированный дизайнер)
  • Шаблон адаптера
  • Шаблон стратегии

Ссылки [ править ]

  1. ^ а б Гамма, Эрих ; Хелм, Ричард ; Джонсон, Ральф ; Влиссидес, Джон (1994). «Шаблонный метод». Шаблоны проектирования . Эддисон-Уэсли. С.  325–330 . ISBN 0-201-63361-2.
  2. ^ Фриман, Эрик; Фриман, Элизабет; Сьерра, Кэти; Бейтс, Берт (2004). Хендриксон, Майк; Лукидес, Майк (ред.). Head First Design Patterns (мягкая обложка) . 1 . О'РЕЙЛИ. стр. 289, 311. ISBN  978-0-596-00712-6. Проверено 12 сентября 2012 .
  3. ^ a b «Шаблон проектирования метода шаблонов» . Source Making - обучение ИТ-специалистов . Проверено 12 сентября 2012 . Шаблонный метод широко используется во фреймворках.
  4. ^ «Шаблон проектирования шаблонного метода - Структура» . w3sDesign.com . Проверено 12 августа 2017 .
  5. ^ Легенда LePUS3. Получено с http://lepus.org.uk/ref/legend/legend.xml .
  6. ^ a b c Чанг, Карло (2011). Шаблоны проектирования Pro Objective-C для iOS . Беркли, Калифорния: Апресс. п. 266. ISBN. 978-1-4302-3331-2.
  7. ^ Влиссидес, Джон (1998-06-22). Штриховка по образцу: примененные шаблоны дизайна . Эддисон-Уэсли Профессионал. С. 85–101. ISBN 978-0201432930.

Внешние ссылки [ править ]

  • Шесть распространенных применений шаблона шаблона
  • Работа с шаблонными классами в PHP 5
  • Шаблон дизайна метода шаблона