Шаблонний метод
Аналогія
Допустимо, ви зібралися будувати будинки. Етапи будуть такими:
- Підготовка фундаменту.
- Зведення стін.
- Настил даху.
- Настил перекриттів.
Порядок етапів ніколи не змінюється. Ви не настеліть дах до зведення стін - і т. д. Але кожен етап модифікується: стіни, наприклад, можна звести з дерева, цегли або газобетону.
Коротко
"Шаблонний метод" визначає каркас виконання певного алгоритму, але реалізацію самих етапів делегує дочірнім класам.
Вікіпедія
«Шаблонний метод» - це поведінковий шаблон, що визначає основу алгоритму і дозволяє спадкоємцям перевизначати деякі кроки алгоритму, не змінюючи його структуру загалом.
Приклад
Припустимо, у нас є програмний інструмент, що дозволяє тестувати, проводити контроль якості коду (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-сборки на сервере