Описан поведенческий шаблон проектирования Template Method, его применение, пример реализации.
Содержание
- Применение
- Реализация
- Итоги
Применение
Думаю, многие сталкивались с ситуацией, когда клиентские запросы требовали весьма схожей обработки, но тем не менее не идентичной. Что в этом случае делать? Самое простое дублировать во второй обработчик ранее созданный код. Простое, но не лучшее решение. А если таких запросов не два и не три? А если в будущем поменяется стандартная обработка?
Часто в этом случае может помочь поведенческий шаблон проектирования Template Method. Его идея заключается в том, чтобы в родительском классе всю обработку разделить на неизменную часть алгоритма и ту, что меняется. В родителе определяется неизменяемая часть обработки и декларируется изменяемая часть, которая потом определяется в наследниках. Как вариант, в родителе можно полностью определить обработку по умолчанию, а в наследниках переопределять изменяемую часть. Таким образом, шаблонный метод за счет наследования позволяет модифицировать часть алгоритма обработки, сохраняя его общую структуру.
Реализация
В качестве примера реализации шаблона Template Method будем моделировать работу автомобиля. Вначале создадим родительский абстрактный класс, в котором определим часть методов моделирования по умолчанию и часть абстрактных методов, которые должны будут определены в наследниках. Кроме того, в родительском классе определим шаблонный метод, определяющий структуру алгоритма моделирования.
abstract class AbstractCar
{
//шаблонный метод определяет общий алгоритм
public function templateMethod()
{
$this->start();
$this->incSpeed();
$this->decSpeed();
$this->stop();
$this->refill();
$this->start();
$this->stop();
}
protected public function start()
{
print "Авто начало движение.";
}
protected public function stop()
{
print "Авто остановлено.";
}
protected public function incSpeed()
{
print "Авто увеличило скорость.";
}
protected public function decSpeed()
{
print "Авто умешьшило скорость.";
}
// декларируем метод, который будет определен в наследниках
abstract protected function refill();
}
В родительском классе метод templateMethod() определяет алгоритм моделирования автомобиля. Также приведены методы моделирования по умолчанию и задекларирован метод refill() заправки автомобиля. Последний будет определен в наследниках родителя.
class PetrolCar extends AbstractCar
{
protected function refill()
{
print "Заправка бензином";
}
}
class ElectricCar extends AbstractCar
{
protected function refill()
{
print "Заправка аккумуляторных батарей";
}
}
Итоги
Сегодня был рассмотрен поведенческий шаблон проектирования Template method. Шаблон позволяет избежать дублирования кода при использовании схожих алгоритмов обработки. Это достигается за счет разделения в родительском классе алгоритма на неизменяемые и изменяемые элементы. Неизменяемая часть определяется в родительком классе, а изменяемая составляющая определяется в наследниках родителя. Общая структура алгоритма при этом остается неизменной и определяется шаблонным методом родительского класса.
Перейти к списку шаблонов проектирования.