Шаблонний метод (англ. Template Method) — шаблон проєктування, належить до класу шаблонів поведінки.
Призначення
Визначає [en] алгоритму та дозволяє підкласам перевизначити деякі кроки алгоритму, не змінюючи структуру в цілому.
Застосовність
Слід використовувати шаблон Шаблонний метод коли:
- треба одноразово використати інваріантні частини алгоритму, залишаючи реалізацію поведінки, що змінюється, на розсуд підкласів;
- треба відокремити та локалізувати в одному класі поведінку, що є загальною для усіх підкласів, щоб запобігти дублювання коду. Це хороший приклад техніки «винесення за лапки з метою узагальнення», що описана в роботі Вільяма Опдайка (англ. William Opdyke) та Ральфа Джонсона (англ. Ralph Johnson) [JO93,OJ93]. Спочатку ідентифікуються відмінності в існуючому коді, а потім вони виносяться у окремі операції. У кінцевому підсумку відмінні фрагменти коду замінюються шаблонним методом, з котрого викликаються нові операції;
- для управління розширеннями підкласів. Можна визначити шаблонний метод таким чином, що він буде викликати операції-зачіпки у означених точках, дозволивши тим самим розширення тільки у цих точках.
Структура
- AbstractClass — абстрактний клас:
- визначає абстрактні примітивні операції, що заміщуються у конкретних підкласах для реалізації кроків алгоритму;
- реалізує шаблонний метод, що визначає скелет алгоритму. Шаблонний метод викликає примітивні операції, а також операції, означенні у класі AbstractClass, чи в інших об'єктах;
- ConcreteClass — конкретний клас:
- реалізує примітивні операції, що виконують кроки алгоритму у спосіб, котрий залежить від підкласу;
Взаємини
ConcreteClass припускає, що інваріантні кроки алгоритму будуть виконані у AbstractClass.
Переваги та недоліки
Переваги
- Немає копіювання коду.
- Лише кілька методів потрібно перевизначити.
- Гнучкість дозволяє підкласам вирішити, як здійснювати кроки в алгоритмі.
Недоліки
- Налагодження та розуміння послідовності алгоритму може іноді бути складною.
- Підтримка структури шаблонів може бути проблемою, оскільки зміни на будь-якому рівні (низький рівень або високий рівень) можуть перешкоджати реалізації.
Зв'язок з іншими патернами
- Шаблонний метод задає кроки алгоритму, які реалізовують підкласи. Стратегія задає алгоритм який можна виконати декількома способами, до того ж вибрати ці способи на етапі виконання програми
Реалізація
C++
#include <iostream> using namespace std; class ApplicationFramework { protected: // кроки алгоритму перевизначатимуться в похідних класах virtual void custom1() = 0; virtual void custom2() = 0; public: // сам алгоритм незмінний void templateMethod(int n = 1) { for (int i = 0; i< n; ++i) { custom1(); custom2(); } } }; class MyAppl : public ApplicationFramework { protected: void custom1() { cout << " Hello, "; } void custom2() { cout << " World!\n"; } }; class CalcAppl : public ApplicationFramework { protected: void custom1() { cout << " Results of important calculations are : \n"; } void custom2() { cout << " 2 + 2 = " << 2 + 2 << " \t2x2 = " << 2 * 2 << '\n'; } }; void main() { MyAppl app; app.templateMethod(3); CalcAppl cApp; cApp.templateMethod(); }
C#
namespace TemplateMethodPattern { abstract class RealEstateBase { // кроки алгоритму перевизначатимуться в похідних класах protected abstract double GetTaxes(); protected abstract double GetSquare(); // сам алгоритм незмінний public double GetPrice() { var squarePrice = 15; return GetSquare() * squarePrice + GetTaxes(); } } class Appartment : RealEstateBase { protected override double GetSquare() { return 50; } protected override double GetTaxes() { return 15; } } class PrivateHouse : RealEstateBase { protected override double GetSquare() { return 25; } protected override double GetTaxes() { return 10; } } class Program { static void Main(string[] args) { RealEstateBase realEstate = new PrivateHouse(); var price = realEstate.GetPrice(); System.Console.WriteLine(price); } } }
Джерела
- Design Patterns: Elements of Reusable Object-Oriented Software [ 9 листопада 2012 у Wayback Machine.]
Література
Алан Шаллоуей, Джеймс Р. Тротт. Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М. : «Вильямс», 2002. — 288 с. — .
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Shablonnij metod angl Template Method shablon proyektuvannya nalezhit do klasu shabloniv povedinki PriznachennyaViznachaye en algoritmu ta dozvolyaye pidklasam pereviznachiti deyaki kroki algoritmu ne zminyuyuchi strukturu v cilomu ZastosovnistSlid vikoristovuvati shablon Shablonnij metod koli treba odnorazovo vikoristati invariantni chastini algoritmu zalishayuchi realizaciyu povedinki sho zminyuyetsya na rozsud pidklasiv treba vidokremiti ta lokalizuvati v odnomu klasi povedinku sho ye zagalnoyu dlya usih pidklasiv shob zapobigti dublyuvannya kodu Ce horoshij priklad tehniki vinesennya za lapki z metoyu uzagalnennya sho opisana v roboti Vilyama Opdajka angl William Opdyke ta Ralfa Dzhonsona angl Ralph Johnson JO93 OJ93 Spochatku identifikuyutsya vidminnosti v isnuyuchomu kodi a potim voni vinosyatsya u okremi operaciyi U kincevomu pidsumku vidminni fragmenti kodu zaminyuyutsya shablonnim metodom z kotrogo viklikayutsya novi operaciyi dlya upravlinnya rozshirennyami pidklasiv Mozhna viznachiti shablonnij metod takim chinom sho vin bude viklikati operaciyi zachipki u oznachenih tochkah dozvolivshi tim samim rozshirennya tilki u cih tochkah StrukturaUML diagrama sho opisuye strukturu shablonu proyektuvannya Shablonnij metod AbstractClass abstraktnij klas viznachaye abstraktni primitivni operaciyi sho zamishuyutsya u konkretnih pidklasah dlya realizaciyi krokiv algoritmu realizuye shablonnij metod sho viznachaye skelet algoritmu Shablonnij metod viklikaye primitivni operaciyi a takozh operaciyi oznachenni u klasi AbstractClass chi v inshih ob yektah ConcreteClass konkretnij klas realizuye primitivni operaciyi sho vikonuyut kroki algoritmu u sposib kotrij zalezhit vid pidklasu VzayeminiConcreteClass pripuskaye sho invariantni kroki algoritmu budut vikonani u AbstractClass Perevagi ta nedolikiPerevagi Nemaye kopiyuvannya kodu Lishe kilka metodiv potribno pereviznachiti Gnuchkist dozvolyaye pidklasam virishiti yak zdijsnyuvati kroki v algoritmi Nedoliki Nalagodzhennya ta rozuminnya poslidovnosti algoritmu mozhe inodi buti skladnoyu Pidtrimka strukturi shabloniv mozhe buti problemoyu oskilki zmini na bud yakomu rivni nizkij riven abo visokij riven mozhut pereshkodzhati realizaciyi Zv yazok z inshimi paternamiShablonnij metod zadaye kroki algoritmu yaki realizovuyut pidklasi Strategiya zadaye algoritm yakij mozhna vikonati dekilkoma sposobami do togo zh vibrati ci sposobi na etapi vikonannya programiRealizaciyaC Priklad realizaciyi na movi S include lt iostream gt using namespace std class ApplicationFramework protected kroki algoritmu pereviznachatimutsya v pohidnih klasah virtual void custom1 0 virtual void custom2 0 public sam algoritm nezminnij void templateMethod int n 1 for int i 0 i lt n i custom1 custom2 class MyAppl public ApplicationFramework protected void custom1 cout lt lt Hello void custom2 cout lt lt World n class CalcAppl public ApplicationFramework protected void custom1 cout lt lt Results of important calculations are n void custom2 cout lt lt 2 2 lt lt 2 2 lt lt t 2x2 lt lt 2 2 lt lt n void main MyAppl app app templateMethod 3 CalcAppl cApp cApp templateMethod C Priklad realizaciyi na movi S namespace TemplateMethodPattern abstract class RealEstateBase kroki algoritmu pereviznachatimutsya v pohidnih klasah protected abstract double GetTaxes protected abstract double GetSquare sam algoritm nezminnij public double GetPrice var squarePrice 15 return GetSquare squarePrice GetTaxes class Appartment RealEstateBase protected override double GetSquare return 50 protected override double GetTaxes return 15 class PrivateHouse RealEstateBase protected override double GetSquare return 25 protected override double GetTaxes return 10 class Program static void Main string args RealEstateBase realEstate new PrivateHouse var price realEstate GetPrice System Console WriteLine price DzherelaDesign Patterns Elements of Reusable Object Oriented Software 9 listopada 2012 u Wayback Machine LiteraturaAlan Shallouej Dzhejms R Trott Shablony proektirovaniya Novyj podhod k obektno orientirovannomu analizu i proektirovaniyu Design Patterns Explained A New Perspective on Object Oriented Design M Vilyams 2002 288 s ISBN 0 201 71594 5