Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Design Patterns via C#.pdf
Скачиваний:
154
Добавлен:
17.03.2016
Размер:
13.25 Mб
Скачать

274

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

Паттерн 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 используя при этом технику абстрагирования вариантов использования.

Фабричные методы как абстрактные, так и реализации.

275

Реализация

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

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

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

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

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

которые могли бы усложнить собой работу клиента, тем самым избавляя клиента от лишних знаний о работе низкоуровневых операций.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]