Патерн (шаблон) проектування Template Method (шаблонний метод)
- Призначення паттерна Template Method
- Обговорення паттерна Template Method
- Структура паттерна Template Method
- Приклад паттерна Template Method
- Використання паттерна Template Method
- Реалізація патерну Template Method
патерни » патерни поведінки »Template Method
Призначення паттерна Template Method
- Патерн Template Method визначає основу алгоритму і дозволяє подклассам змінити деякі кроки цього алгоритму без зміни його загальної структури.
- Базовий клас визначає кроки алгоритму за допомогою абстрактних операцій, а похідні класи їх реалізують.
розв'язувана проблема
Є два різних, але в той же час дуже схожих компонента. Ви хочете внести зміни в обидва компонента, уникнувши дублювання коду.
Обговорення паттерна Template Method
Проектувальник компонента вирішує, які кроки алгоритму є незмінними (або стандартними), а які змінними (або налаштованим). Абстрактний базовий клас реалізує стандартні кроки алгоритму і може надавати (чи ні) реалізацію за замовчуванням для параметрів, що кроків. Змінні кроки можуть (або повинні) надаватися клієнтом компонента в конкретних похідних класах.
Проектувальник компонента визначає необхідні кроки алгоритму, порядок їх виконання, але дозволяє клієнтам компонента розширювати або заміщати деякі з цих кроків.
Патерн Template Method широко застосовується в каркасах додатків (frameworks). Кожен каркас реалізує незмінні частини архітектури в предметної області, а також визначає ті частини, які можуть або повинні налаштовуватися клієнтом. Таким чином, каркас додатка стає "центром всесвіту", а налаштування клієнта є просто "третьою планетою від Сонця". Цю інвертовану структуру коду ласкаво називають принципом Голлівуду - "Не дзвоніть нам, ми самі вам зателефонуємо".
Структура паттерна Template Method
UML-діаграма класів паттерна Template Method
Реалізація методу templateMethod () викликає методи stepOne (), stepTwo () і stepThree (). Метод stepTwo () є "заміщає" методом. Він оголошений в базовому класі, а визначається в похідних класах. Каркаси додатків широко використовують патерн Тemplate Method. Весь повторно використовуваний код визначається в базових класах каркаса, потрібну поведінку системи клієнти визначають в створюваних похідних класах.
Приклад паттерна Template Method
Патерн Template Method визначає основу алгоритму і дозволяє подклассам змінити деякі кроки цього алгоритму без зміни його загальної структури. Будівельники будівель використовують шаблонний метод при проектуванні нових будинків. Тут можуть використовуватися вже існуючі типові плани, в яких модифікуються тільки окремі частини.
Використання паттерна Template Method
- Досліджуйте алгоритм і вирішите, які кроки є стандартними, а які повинні визначатися підкласами.
- Створіть новий абстрактний базовий клас, в якому буде реалізований принцип "не дзвоніть нам, ми самі вам зателефонуємо".
- Помістіть в новий клас основу алгоритму (шаблонний метод) і визначення стандартних кроків.
- Для кожного кроку, що вимагає різні реалізації, визначте "заміщає" віртуальний метод. Цей метод може мати реалізацію за замовчуванням або бути чисто віртуальним.
- Викличте "заміщає" метод з шаблонного методу.
- Створіть підкласи від нового абстрактного базового класу і реалізуйте в них "заміщають" методи.
Особливості паттерна Template Method
- Template Method використовує спадкування для модифікації частини алгоритму. стратегія використовує делегування для модифікації всього алгоритму.
- Стратегія змінює логіку окремих об'єктів. Template Method змінює логіку всього класу.
- фабричні методи часто викликаються з шаблонних методів.
Реалізація патерну Template Method
- Стандартизує основу алгоритму в шаблонному методі базового класу.
- Для кроків, які потребують особливої реалізації, визначте "заміщають" методи.
- Похідні класи реалізують "заміщають" методи.
#include <iostream> using namespace std; class Base {void a () {cout << "a"; } Void c () {cout << "c"; } Void e () {cout << "e"; } // 2. Для кроків, які потребують особливої реалізації, визначте // "заміщають" методи. virtual void ph1 () = 0; virtual void ph2 () = 0; public: // 1. стандартизує основу алгоритму в шаблонному методі // базового класу void execute () {a (); ph1 (); c (); ph2 (); e (); }}; class One: public Base {// 3. Похідні класи реалізують "заміщають" методи. / * Virtual * / void ph1 () {cout << "b"; } / * Virtual * / void ph2 () {cout << "d"; }}; class Two: public Base {/ * virtual * / void ph1 () {cout << "2"; } / * Virtual * / void ph2 () {cout << "4"; }}; int main () {Base * array [] = {& One (), & Two ()}; for (int i = 0; i <2; i ++) {array [i] -> execute (); cout << '\ n'; }}
Висновок програми:
джерело: http://sourcemaking.com/design_patterns/template_method/