Шаблонний метод (шаблон проєктування)

Шаблонний метод (англ. Template Method) — шаблон проєктування, належить до класу шаблонів поведінки.

Призначення

Визначає кістяк[en] алгоритму та дозволяє підкласам перевизначити деякі кроки алгоритму, не змінюючи структуру в цілому.

Застосовність

Слід використовувати шаблон Шаблонний метод коли:

  • треба одноразово використати інваріантні частини алгоритму, залишаючи реалізацію поведінки, що змінюється, на розсуд підкласів;
  • треба відокремити та локалізувати в одному класі поведінку, що є загальною для усіх підкласів, щоб запобігти дублювання коду. Це хороший приклад техніки «винесення за лапки з метою узагальнення», що описана в роботі Вільяма Опдайка (англ. William Opdyke) та Ральфа Джонсона (англ. Ralph Johnson) [JO93,OJ93]. Спочатку ідентифікуються відмінності в існуючому коді, а потім вони виносяться у окремі операції. У кінцевому підсумку відмінні фрагменти коду замінюються шаблонним методом, з котрого викликаються нові операції;
  • для управління розширеннями підкласів. Можна визначити шаблонний метод таким чином, що він буде викликати операції-зачіпки у означених точках, дозволивши тим самим розширення тільки у цих точках.

Структура

UML діаграма, що описує структуру шаблону проєктування Шаблонний метод
  • 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);
		}
	}
}

Джерела

  • Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994). Design Patterns: Elements of Reusable Object-Oriented Software (вид. [1]). Addison–Wesley. с. 395. {{cite book}}: Зовнішнє посилання в |edition= (довідка)(англ.)
  • Alan Shallowey, James R. Trott (2004). Design Patterns Explained: A New Perspective on Object-Oriented Design (PDF).(англ.)
Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Portal di Ensiklopedia Dunia

Kembali kehalaman sebelumnya