Что такое паттерн "Шаблонный метод" (Template Method)

Шаблонный метод — поведенческий паттерн проектирования, который определяет скелет алгоритма в методе базового класса, оставляя некоторые шаги алгоритма для переопределения в подклассах. Это позволяет подклассам изменять части алгоритма, не меняя его структуры.

Представьте, что у вас есть процесс приготовления напитка: сначала заварить, затем добавить что-то по вкусу. Шаблонный метод задаёт общий порядок действий, а детали оставляет подклассам.

Преимущества паттерна «Шаблонный метод»

  • Повторное использование кода и контроль общего алгоритма.
  • Возможность менять поведение отдельных шагов без изменения общей логики.
  • Упрощение поддержки и расширения.

Пример:

  • Абстрактный класс с шаблонным методом.
  • Конкретные подклассы реализуют необходимые шаги.

Где применяется паттерн «Шаблонный метод»?

  • В фреймворках и библиотеках для стандартизации алгоритмов.
  • В сценариях с общим алгоритмом и вариативными шагами.
  • При реализации каркаса приложения.

Пример реализации на JavaScript

// Абстрактный класс с шаблонным методом class CaffeineBeverage { prepare() { this.boilWater(); this.brew(); this.pourInCup(); this.addCondiments(); } boilWater() { console.log("Кипятим воду"); } brew() { throw new Error("Метод brew() должен быть реализован"); } pourInCup() { console.log("Наливаем в чашку"); } addCondiments() { throw new Error("Метод addCondiments() должен быть реализован"); } } // Конкретный подкласс для чая class Tea extends CaffeineBeverage { brew() { console.log("Завариваем чай"); } addCondiments() { console.log("Добавляем лимон"); } } // Конкретный подкласс для кофе class Coffee extends CaffeineBeverage { brew() { console.log("Завариваем кофе"); } addCondiments() { console.log("Добавляем сахар и молоко"); } } // Использование const tea = new Tea(); tea.prepare(); const coffee = new Coffee(); coffee.prepare();

Когда стоит использовать паттерн «Шаблонный метод»?

  • Когда алгоритм имеет фиксированную структуру, но отдельные шаги могут изменяться.
  • Для избежания дублирования кода при реализации похожих алгоритмов.
  • В случаях, когда нужно обеспечить контроль общего процесса.

Отличие от других паттернов

  • В отличие от Стратегии, где алгоритм полностью делегируется объекту стратегии, в Шаблонном методе часть алгоритма реализована в базовом классе.
  • Отличается от Абстрактной фабрики, которая создаёт семейство объектов, а здесь фокус на последовательности действий.

Плюсы паттерна

  • Повторное использование и структурирование кода.
  • Чёткое разделение неизменяемых и изменяемых частей алгоритма.
  • Упрощение расширения алгоритма.

Минусы паттерна

  • Жёсткая иерархия классов.
  • Подклассы зависят от реализации базового класса.