Шаблонний метод (шаблон проєктування)
Перейти до навігації
Перейти до пошуку
Шаблонний метод (англ. Template Method) — шаблон проєктування, належить до класу шаблонів поведінки.
Визначає кістяк[en] алгоритму та дозволяє підкласам перевизначити деякі кроки алгоритму, не змінюючи структуру в цілому.
Слід використовувати шаблон Шаблонний метод коли:
- треба одноразово використати інваріантні частини алгоритму, залишаючи реалізацію поведінки, що змінюється, на розсуд підкласів;
- треба відокремити та локалізувати в одному класі поведінку, що є загальною для усіх підкласів, щоб запобігти дублювання коду. Це хороший приклад техніки «винесення за лапки з метою узагальнення», що описана в роботі Вільяма Опдайка (англ. William Opdyke) та Ральфа Джонсона (англ. Ralph Johnson) [JO93,OJ93]. Спочатку ідентифікуються відмінності в існуючому коді, а потім вони виносяться у окремі операції. У кінцевому підсумку відмінні фрагменти коду замінюються шаблонним методом, з котрого викликаються нові операції;
- для управління розширеннями підкласів. Можна визначити шаблонний метод таким чином, що він буде викликати операції-зачіпки у означених точках, дозволивши тим самим розширення тільки у цих точках.
- AbstractClass — абстрактний клас:
- визначає абстрактні примітивні операції, що заміщуються у конкретних підкласах для реалізації кроків алгоритму;
- реалізує шаблонний метод, що визначає скелет алгоритму. Шаблонний метод викликає примітивні операції, а також операції, означенні у класі AbstractClass, чи в інших об'єктах;
- ConcreteClass — конкретний клас:
- реалізує примітивні операції, що виконують кроки алгоритму у спосіб, котрий залежить від підкласу;
ConcreteClass припускає, що інваріантні кроки алгоритму будуть виконані у AbstractClass.
- Немає копіювання коду.
- Лише кілька методів потрібно перевизначити.
- Гнучкість дозволяє підкласам вирішити, як здійснювати кроки в алгоритмі.
- Налагодження та розуміння послідовності алгоритму може іноді бути складною.
- Підтримка структури шаблонів може бути проблемою, оскільки зміни на будь-якому рівні (низький рівень або високий рівень) можуть перешкоджати реалізації.
- Шаблонний метод задає кроки алгоритму, які реалізовують підкласи. Стратегія задає алгоритм який можна виконати декількома способами, до того ж вибрати ці способи на етапі виконання програми
Приклад реалізації на мові С++
#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();
}
Приклад реалізації на мові С#
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 с. — ISBN 0-201-71594-5.