НЕ МОЛЧИ!!!    Сделай что-нибудь, чтобы остановить войну России в Украине.
...бойтесь людей равнодушных - именно с их молчаливого согласия происходят все самые ужасные преступления на свете.   ("Репортаж с петлёй на шее")

Шаблон проектирования Template Method (Шаблонный метод)

Описан поведенческий шаблон проектирования 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. Шаблон позволяет избежать дублирования кода при использовании схожих алгоритмов обработки. Это достигается за счет разделения в родительском классе алгоритма на неизменяемые и изменяемые элементы. Неизменяемая часть определяется в родительком классе, а изменяемая составляющая определяется в наследниках родителя. Общая структура алгоритма при этом остается неизменной и определяется шаблонным методом родительского класса.

Перейти к списку шаблонов проектирования.