Видео курс Шаблоны проектирования

Основные темы, рассматриваемые на уроке:
01:58 1 Метафора
04:28 2 Программный код метафоры
09:42 3 Структура паттерна на языке UML
10:23 4 Структура паттерна на языке C#
14:03 5 Применимость Паттерна
22:26 6 Назначение паттерна

Видео урок посвящен паттерну проектирования Template Method, который формирует структуру алгоритма и позволяет в производных классах реализовать, заместить (перекрыть) или переопределить определенные шаги (участки) алгоритма, не изменяя структуру алгоритма в целом.

Для просмотра полной версии видеокурса и получения доступа к дополнительным учебным материалам Вам необходимо оформить подписку
Оформить подписку

Паттерн Template Method

Название

Шаблонный метод

Также известен как

-

Классификация

По цели: поведенческий

По применимости: к классам

Частота использования

Средняя               -   1 2 3 4 5

Назначение

Паттерн Template Method - формирует структуру алгоритма и позволяет в производных классах реализовать, заместить (перекрыть) или переопределить определенные шаги (участки) алгоритма, не изменяя структуру алгоритма в целом.

Введение

Одним из важнейших технологических приемов структурного программирования является декомпозиция (разбиение) решаемой задачи на подзадачи. Подзадача – это более простая с точки зрения программирования часть исходной задачи. Алгоритмы решения таких подзадач называются вспомогательными алгоритмами. В связи с этим возможны два пути в построении алгоритма: «сверху-вниз» и «снизу-вверх». Программирование методом «сверху-вниз» (или метод последовательной детализации) – процесс пошагового разбиения алгоритма на более мелкие части с целью получения таких элементов, для которых независимым образом можно легко написать вспомогательные алгоритмы (шаги общего алгоритма).

Для лучшего понимания идеи использования техники «шаблонный метод» предлагается рассмотреть простейшую программу, которая рисует двухцветные государственные флаги. 

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

См. пример к главе: \022_Template Method\002_TemplateMethod

Как видно из примера кода, метод Draw из абстрактного класса TwoColorFlag содержит в себе шаблон (набор шагов как последовательность вызовов абстрактных методов DrawTopPart и DrawBottomPart) для рисования полос двухцветного флага, и программист который решит реализовать, например, двухцветный флаг Гаити  должен будет следовать шаблону вывода верхней и нижней полос флага, состоящему из двух шагов: нарисовать верхнюю часть флага синим цветом и нарисовать нижнюю часть флага красным цветом.

Структура паттерна на языке UML

См. пример к главе: \022_Template Method\001_TemplateMethod

Структура паттерна на языке C#

См. пример к главе: \022_Template Method\001_TemplateMethod

Участники

  • AbstractClass - Абстрактный класс:
  • абстрактные методы PrimitiveOperation1, PrimitiveOperation2PrimitiveOperationN, реализуемые в конкретных производных классах. Каждая реализация отдельного абстрактного метода PrimitiveOperation1, PrimitiveOperation2PrimitiveOperationN, представляет собой один шаг общего алгоритма. Абстрактный класс AbstractClass содержит реализацию метода TemplateMethod в котором вызываются абстрактные методы PrimitiveOperation1, PrimitiveOperation2PrimitiveOperationN, (через использование техники абстрагирования вариантов использования) в определенной последовательности, тем самым формируя структуру (скелет) общего алгоритма из более мелких алгоритмов представленных методами PrimitiveOperation1, PrimitiveOperation2PrimitiveOperationN.
  • ConcreteClass - Конкретный класс:
  • абстрактные методы PrimitiveOperation1, PrimitiveOperation2PrimitiveOperationN, из базового класса AbstractClass. Реализации абстрактных методов PrimitiveOperation1, PrimitiveOperation2PrimitiveOperationN, представляют собой отдельные шаги общего алгоритма.

Отношения между участниками

Отношения между классами

  • Конкретный класс ConcreteClass связан связью отношения наследования с абстрактным классом AbstractClass.

Отношения между объектами

  • Конкретный класс ConcreteClass предполагает, что инвариантные (постоянные, не изменяющиеся в процессе эволюции системы) шаги алгоритма будут выполнены (через использование техники абстрагирования вариантов использования) в базовом классе AbstractClass.

Мотивация

Предлагается рассмотреть пример построения простейшей программы, в которой имеются классы Application и Document.

Применимость паттерна

Паттерн Template Method рекомендуется использовать, когда:

  • Требуется в базовом классе организовать неизменяемую последовательность шагов алгоритма, позволяя изменять реализацию каждого отдельного шага в производных классах.
  • Требуется в базовом классе описать последовательность шагов алгоритма общую для всех подклассов, с целью избежать дублирования кода. Такой подход является примером техники «вынесения за скобки с целью обобщения». Под «вынесением за скобки» подразумевается вынесение за пределы метода TemplateMethod или даже класса функциональности, которая будет располагаться в реализациях методов PrimitiveOperation1 и PrimitiveOperation2. Под «целью обобщения» подразумевается наследование.

Результаты

Использование шаблонных методов является одним из фундаментальных приемов повторного использования кода. Применение паттерна Template Method особенно важно в библиотеках классов и каркасах (framework), поскольку этот паттерн дает разработчикам возможность вынести общее поведение (последовательность шагов алгоритма) в библиотечные классы.

Использование шаблонных методов приводит к инвертированной (вывернутой) структуре программного кода. Такой эффект «вывернутости» проявляется в том, что в базовом классе AbstractClass в методе TemplateMethod происходит вызов абстрактных методов PrimitiveOperation1 и PrimitiveOperation2 (благодаря технике абстрагирования вариантов использования), но реализация этих методов находится в производных классах ConcreteClass.   Такую «вывернутую» структуру кода иногда называют принципом Голливуда. Подразумевается, что в Голливуде известных режиссеров мало, а вот актеров, которые хотят получить роль в перспективной кинокартине очень много, соответственно, если каждый актер будет звонить режиссерам и предлагать себя на роль, то режиссеру придётся целый день принимать звонки. Поэтому по правилам Голливуда, не приветствуется, когда актер сам «напрашивается на роль», отсюда и принцип – «Не звоните нам, мы сами позвоним.» (так говорят режиссёры). В данной метафоре абстрактный класс AbstractClass – режиссер, метод TemplateMethod – кинокартина (сценарий), конкретный класс ConcreteClass – сообщество актеров, а методы PrimitiveOperation1 и PrimitiveOperation2 – сами актеры. Применительно к паттерну Template Method метафора означает, что базовый класс AbstractClass вызывает методы PrimitiveOperation1 и PrimitiveOperation2 из производного класса ConcreteClass, но не наоборот. Понятно, что в Голливуде одним режиссером ставится некоторое количество кинокартин по сценариям (TemplateMethod), и соответственно, как в разных фильмах может играть один актер, так и в случае с методами PrimitiveOperation1 и PrimitiveOperation2, они могут быть вызваны из разных шаблонных методов, например, TemplateMethod1, TemplateMethod2, TemplateMethod3.

Шаблонный метод TemplateMethod может вызывать:

  • Реализации примитивных операций (реализаций шагов алгоритма) PrimitiveOperation1 и PrimitiveOperation2 из производного класса ConcreteClass.
  • Реализации примитивных операций (реализаций шагов алгоритма) PrimitiveOperation1 и PrimitiveOperation2 из того же класса AbstractClass.
  • Абстрактные методы PrimitiveOperation1 и PrimitiveOperation2 используя при этом технику абстрагирования вариантов использования.
  • Фабричные методы как абстрактные, так и реализации.

Реализация

Полезные приемы реализации паттерна Template Method:

  • Использование контроля доступа в C#.

Под контролем доступа, следует понимать использование невиртуального высокоуровневого интерфейса для работы с виртуальным низкоуровневым интерфейсом. Под невиртуальным интерфейсом следует понимать использование метода TemplateMethod, который вызывает методы PrimitiveOperation1 и PrimitiveOperation2, которые рекомендуется по возможности создавать как виртуальные и защищенные (помечать ключевыми словами virtual и protected), в таком случае гарантируется, что их сможет вызвать только метод TemplateMethod.

  • Сокращение числа доступных клиенту «низкоуровневых» методов.

Важной целью при проектировании шаблонных методов TemplateMethod, является сокращение числа доступных клиенту простых методов PrimitiveOperation1 и PrimitiveOperation2, которые могли бы усложнить собой работу клиента, тем самым избавляя клиента от лишних знаний о работе низкоуровневых операций.

  • Соглашение об именах.

В языке C# нет особых рекомендаций для включения в сигнатуру создаваемого шаблонного метода специальных префиксов или постфиксов, для того чтобы оттенить принадлежность шаблонного метода к категории «шаблонных».

© 2017 ITVDN, все права защищены