- •Вступление
- •Порождающие шаблоны проектирования
- •Использование
- •Перечень порождающих шаблонов
- •Абстрактная фабрика — Абстрактная фабрика
- •Цель
- •Плюсы
- •Минусы
- •Применимость
- •Структура
- •Пример реализации
- •Builder — Строитель
- •Цель
- •Плюсы
- •Применение
- •Структура
- •Пример реализации
- •Factory method — Фабричный метод
- •Цель
- •Структура
- •Плюсы
- •Минусы
- •Пример реализации
- •Lazy initialization — Ленивая инициализация
- •Достоинства
- •Недостатки
- •Пример реализации
- •Object pool — Объектный пул
- •Применение
- •Переполнение
- •Примеры
- •Ловушки
- •Пример реализации
- •Prototype — Прототип
- •Назначение
- •Применимость
- •Структура
- •Пример реализации
- •Singleton — Одиночка
- •Цель
- •Плюсы
- •Минусы
- •Применение
- •Структура
- •Пример реализации
- •Double checked locking - Блокировка с двойной проверкой
- •Пример реализации
- •Структурные шаблоны проектирования
- •Использование
- •Перечень структурных шаблонов
- •Front Controller — Входная точка
- •Пример
- •Структура
- •Adapter — Адаптер
- •Задача
- •Способ решения
- •Участники
- •Структура
- •Следствия
- •Реализация
- •Пример реализации
- •Bridge — Мост
- •Цель
- •Структура
- •Описание
- •Использование
- •Пример реализации
- •Composite — Компоновщик
- •Цель
- •Структура
- •Пример реализации
- •Decorator — Декоратор
- •Задача
- •Способ решения
- •Участники
- •Следствия
- •Реализация
- •Замечания и комментарии
- •Применение шаблона
- •Структура
- •Пример реализации
- •Facade — Фасад
- •Структура
- •Проблема
- •Решение
- •Особенности применения
- •Пример реализации
- •Flyweight — Приспособленец
- •Цель
- •Описание
- •Сруктура
- •Пример реализации
- •Proxy — Заместитель
- •Проблема
- •Решение
- •Структура
- •Преимущества
- •Недостатки
- •Сфера применения
- •Прокси и близкие к нему шаблоны
- •Пример реализации
- •Поведенческие шаблоны проектирования
- •Использование
- •Перечень поведенческий шаблонов
- •Chain of responsibility — Цепочка обязанностей
- •Применение
- •Сруктура
- •Пример реализации
- •Command — Команда
- •Цель
- •Описание
- •Сруктура
- •Пример реализации
- •Interpreter — Интерпретатор
- •Проблема
- •Решение
- •Преимущества
- •Недостатки
- •Пример
- •Структура
- •Пример реализации
- •Iterator — Итератор
- •Структура
- •Пример реализации
- •Mediator — Посредник
- •Проблема
- •Решение
- •Преимущества
- •Структура
- •Описание
- •Пример реализации
- •Memento — Хранитель
- •Применение
- •Структура
- •Описание
- •Пример реализации
- •Observer — Наблюдатель
- •Назначение
- •Структура
- •Область применения
- •Пример реализации
- •State — Состояние
- •Структура
- •Пример реализации
- •Strategy — Стратегия
- •Задача
- •Мотивы
- •Способ решения
- •Участники
- •Следствия
- •Реализация
- •Полезные сведения
- •Использование
- •Сруктура
- •Пример реализации
- •Template — Шаблонный метод
- •Применимость
- •Участники
- •Сруктура
- •Пример реализации
- •Visitor — Посетитель
- •Структура
- •Описание средствами псевдокода
- •Проблема
- •Решение
- •Рекомендации
- •Преимущества
- •Недостатки
- •Пример реализации
- •Null Object (Null object)
- •Мотивация
- •Описание
- •Структура
- •Реализация
- •Пример
- •Связь с другими патернами
- •Критика и комментарии
- •Пример реализации
- •Слуга (Servant)
- •Описание
- •Структура
- •Реализаци
- •Пример реализации
- •Specification (Specification)
- •Структура
- •Пример реализации
- •Пример использования
- •Simple Policy
- •Обзор
- •Простыми словами
- •Сруктура
- •Пример реализации
- •Single-serving visitor
- •Применение
- •Пример использования
- •Плюси
- •Минусы
- •Пример реализации
- •Об авторе
Template — Шаблонный метод
Шаблонный метод (Template method) — паттерн поведения классов, шаблон проектирования , определяющий основу алгоритма и позволяющий наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом.
Применимость
Однократное использование инвариантной части алгоритма, с оставлением изменяющейся части на усмотрение наследникам.
Локализация и вычленение общего для нескольких классов кода для избегания дублирования.
Разрешение расширения кода наследниками только в определенных местах.
Участники
Abstract class (абстрактный класс) - определяет абстрактные операции, замещаемые в наследниках для реализации шагов алгоритма; реализует шаблонный метод, определяющий скелет алгоритма. Шаблонный метод вызывает замещаемые и другие, определенные в Abstract class, операции.
Concrete class (конкретный класс) - реализует замещаемые операции необходимым для данной реализации способом.
Concrete class предполагает, что инвариантные шаги алгоритма будут выполнены в AbstractClass.
Сруктура
103
Пример реализации
В примере шаблонный метод реализуется для игр, в которых игроки по очереди делают свой ход.
/**
*An abstract class that is common to several games in
*which players play against the others, but only one is
*playing at a given time.
*/
namespace Design_Patterns
{
class TemplateMethodPattern
{
internal abstract class GameObject
{
protected int PlayersCount;
abstract protected void InitializeGame();
abstract protected void MakePlay(int player);
abstract protected bool EndOfGame();
abstract protected void PrintWinner();
/* A template method : */
public void PlayOneGame(int playersCount)
{
PlayersCount = playersCount; InitializeGame();
var j = 0;
while (!EndOfGame())
{
MakePlay(j);
j = (j + 1) % playersCount;
}
PrintWinner();
}
}
//Now we can extend this class in order to implement actual games:
public class Monopoly : GameObject
{
/* Implementation of necessary concrete methods */
protected override void InitializeGame()
{
// Initialize money
}
protected override void MakePlay(int player)
{
// Process one turn of player
}
protected override bool EndOfGame()
{
return true;
}
104
protected override void PrintWinner()
{
// Display who won
}
/* Specific declarations for the Monopoly game. */
// ...
}
public class Chess : GameObject
{
/* Implementation of necessary concrete methods */
protected override void InitializeGame()
{
// Put the pieces on the board
}
protected override void MakePlay(int player)
{
// Process a turn for the player
}
protected override bool EndOfGame()
{
return true;
// Return true if in Checkmate or Stalemate has been reached
}
protected override void PrintWinner()
{
// Display the winning player
}
/* Specific declarations for the chess game. */
// ...
}
public static void Test()
{
GameObject game = new Monopoly();
game.PlayOneGame(2);
}
}
}
105