Шаблонний метод

Аналогія

Допустимо, ви зібралися будувати будинки. Етапи будуть такими:

  • Підготовка фундаменту.
  • Зведення стін.
  • Настил даху.
  • Настил перекриттів.

Порядок етапів ніколи не змінюється. Ви не настеліть дах до зведення стін - і т. д. Але кожен етап модифікується: стіни, наприклад, можна звести з дерева, цегли або газобетону.

Коротко

"Шаблонний метод" визначає каркас виконання певного алгоритму, але реалізацію самих етапів делегує дочірнім класам.

Вікіпедія

«Шаблонний метод» - це поведінковий шаблон, що визначає основу алгоритму і дозволяє спадкоємцям перевизначати деякі кроки алгоритму, не змінюючи його структуру загалом.

Приклад

Припустимо, у нас є програмний інструмент, що дозволяє тестувати, проводити контроль якості коду (lint), виконувати складання, генерувати звіти складання (звіти про покриття коду, якість коду тощо), а також розгортати додаток на тестовому сервері.

Спочатку наш базовий клас визначає каркас алгоритму збирання.

abstract class Builder
{

    // Шаблонный метод
    final public function build()
    {
        $this->test();
        $this->lint();
        $this->assemble();
        $this->deploy();
    }

    abstract public function test();
    abstract public function lint();
    abstract public function assemble();
    abstract public function deploy();
}

Тепер створюємо реалізації:

class AndroidBuilder extends Builder
{
    public function test()
    {
        echo 'Running android tests';
    }

    public function lint()
    {
        echo 'Linting the android code';
    }

    public function assemble()
    {
        echo 'Assembling the android build';
    }

    public function deploy()
    {
        echo 'Deploying android build to server';
    }
}

class IosBuilder extends Builder
{
    public function test()
    {
        echo 'Running ios tests';
    }

    public function lint()
    {
        echo 'Linting the ios code';
    }

    public function assemble()
    {
        echo 'Assembling the ios build';
    }

    public function deploy()
    {
        echo 'Deploying ios build to server';
    }
}

Використання:

$androidBuilder = new AndroidBuilder();
$androidBuilder->build();

// Output:
// Выполнение Android-тестов
// Линтинг Android-кода
// Создание Android-сборки
// Развёртывание Android-сборки на сервере

$iosBuilder = new IosBuilder();
$iosBuilder->build();

// Output:
// Выполнение iOS-тестов
// Линтинг iOS-кода
// Создание iOS-сборки
// Развёртывание iOS-сборки на сервере