Меню
Главная
Авторизация/Регистрация
 
Главная arrow Информатика arrow Введение в архитектуру программного обеспечения

Паттерн Template Method (Шаблонный метод)

Название и классификация паттерна

Шаблонный метод — паттерн поведения классов.

Назначение паттерна Template Method

Паттерн Template Method определяет основу алгоритма и позволяет подклассам изменить некоторые шаги этого алгоритма без изменения его общей структуры.

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

Решаемая проблема

Имеются два разных, но в то же время очень похожих компонента. Вы хотите внести изменения в оба компонента, избежав дублирования кода.

Обсуждение паттерна Template Method

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

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

Паттерн Template Method широко применяется в каркасах приложений (frameworks). Каждый каркас реализует неизменные части архитектуры в предметной области, а также определяет те части, которые могут или должны настраиваться клиентом. Таким образом, каркас приложения становится «центром вселенной», а настройки клиента являются просто «третьей планетой от Солнца».

UML-диаграмма классов паттерна Template Method Структура паттерна Шаблонный метод показана на рис. 75.

UML-диаграмма паттерна Шаблонный метод

Рис. 75. UML-диаграмма паттерна Шаблонный метод

Реализация метода templateMethod() вызывает методы stepOne(), stepTwo() и stepThree(). Метод stepTwo() является «замещающим» методом. Он объявлен в базовом классе, а определяется в производных классах. Каркасы приложений широко используют паттерн Template Method. Весь повторно используемый код определяется в базовых классах каркаса, нужное поведение системы клиенты определяют в создаваемых производных классах.

Участники

FrameworkClass — абстрактный класс:

  • • определяет абстрактные примитивные операции, замещаемые в конкретных подклассах для реализации шагов алгоритма;
  • • реализует Шаблонный метод, определяющий скелет алгоритма. Шаблонный метод вызывает примитивные операции, а также операции, определенные в классе FrameworkClass или в других объектах;
  • • ApplicationClassOne, ApplicationClassTwo — конкретный класс: реализует примитивные операции, выполняющие шаги алгоритма способом, который зависит от подкласса.

Пример паттерна Template Method

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

Базовая структура А

м| ф 4

Добавлен Добавлены

фронтон флаги Добавлены

фронтон, флаги и башня

Рис. 76. Использование паттерна Шаблонный метод на примере проектирования

архитектуры здания

Использование паттерна Template Method

Исследуйте алгоритм и решите, какие шаги являются стандартными, а какие должны определяться подклассами.

Создайте новый абстрактный базовый класс, в котором будет реализован принцип «не звоните нам, мы сами вам позвоним».

Поместите в новый класс основу алгоритма (Шаблонный метод) и определения стандартных шагов.

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

Вызовите «замещающий» метод из Шаблонного метода.

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

Реализация паттерна Template Method по шагам

Стандартизуйте основу алгоритма в Шаблонном методе базового класса.

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

Производные классы реализуют «замещающие» методы.

#include using namespace std;

class Base

{

void a()

{

cout«"a

}

void c()

{

cout«"c

}

void e()

{

cout«"e

}

//2. Для шагов, требующих особенной реализации, определите // "замещающие" методы, virtual void ph 1 () = 0; virtual void ph2() = 0; public:

// 1. Стандартизуйте основу алгоритма в Шаблонном методе // базового класса void execute()

{

а();

phl();

с();

ph2();

е();

}

};

class One: public Base

{

// 3. Производные классы реализуют "замещающие" методы. /*virtual*/void phi()

{

co?t << "b

}

/*virtual*/void ph2()

{

co?t « "d

}

};

class Two: public Base

{

/*virtual*/void phl()

{

co?t « "2 ";

}

/*virtual*/void ph2()

{

co?t « "4 ";

}

int main()

{

Base *array[] =

{

&One(), &Two()

};

for (int i = 0; i < 2; i++)

{

array[i|->execute(); co?t << ' ';

}

}

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

Особенности паттерна Template Method

Template Method использует наследование для модификации части алгоритма. Стратегия использует делегирование для модификации всего алгоритма.

Стратегия изменяет логику отдельных объектов. Template Method изменяет логику всего класса.

Фабричные методы часто вызываются из Шаблонных методов.

 
Если Вы заметили ошибку в тексте выделите слово и нажмите Shift + Enter
< Пред   СОДЕРЖАНИЕ   След >
 

Популярные страницы