stringtranslate.com

Шаблон метода шаблона

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

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

Обзор

Этот шаблон состоит из двух основных частей:

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

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

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

Состав

Диаграмма классов UML

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

На приведенной выше диаграмме классов UML определяется операция , которая определяет скелет (шаблон) поведения с помощьюAbstractClasstemplateMethod()

Шаблонный метод в LePUS3. [5]

Применение

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

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

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

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

пример С++

Эта реализация C++14 основана на реализации до C++98, описанной в книге.

Шаблон метода шаблона CPP UML.svg

#include <iostream> #include <память>  class View { // AbstractClass public : // определяет абстрактные примитивные операции, которые конкретные подклассы определяют для реализации шагов алгоритма. virtual void doDisplay () {} // реализует шаблонный метод, определяющий скелет алгоритма. Метод шаблона вызывает примитивные операции, а также операции, определенные в AbstractClass или других объектах. недействительный дисплей () { setFocus (); сделатьДисплей (); сброс фокуса (); } виртуальный ~ Просмотр () = по умолчанию ; Private : void setFocus () { std :: cout << "View::setFocus \n " ; } void resetFocus () { std :: cout << "View::resetFocus \n " ; } };                                  class MyView : public View { // ConcreteClass // реализует примитивные операции для выполнения шагов алгоритма, специфичных для подкласса. void doDisplay () override { // отображаем содержимое представления std :: cout << "MyView::doDisplay \n " ; } };                int main () { // Интеллектуальные указатели предотвращают утечки памяти std :: unique_ptr < View > myview = std :: make_unique < MyView > (); myview -> дисплей (); }        

Вывод программы

View :: setFocus MyView :: doDisplay View :: resetFocus

Смотрите также

Рекомендации

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

Внешние ссылки