Что это такое
Паттерн Шаблонный метод (Template Method) фиксирует скелет алгоритма — шаги и их порядок, — но позволяет отдельным шагам меняться. Рецепт пишется один раз; каждый вариант заполняет свои собственные шаги.
В Python скелет находится в настоящем базовом классе: abc.ABC. Это единственный паттерн, где базовый класс лучше протокола, потому что базовый класс должен содержать общий метод-скелет, а не просто описывать форму.
Пример: один рецепт, два напитка
make() управляет порядком: вскипятить, заварить, налить, добавки. Чай и кофе отвечают только на вопросы, как заваривать и что добавить, — они не могут менять порядок шагов или пропускать их.
Скелет остаётся неизменным
Оба напитка проходят одни и те же четыре шага в одном и том же порядке, потому что порядок задан в одном методе. Новый напиток реализует два метода и наследует весь порядок работы, — а @abstractmethod даже не позволит создать напиток, в котором один из них забыт.
Вывод: полная программа на Python
from abc import ABC, abstractmethod
class Drink(ABC):
# Фиксированный скелет находится в базовом классе...
def make(self, name: str) -> None:
print("--", name)
print("вскипятить воду")
print(self.brew())
print("налить в чашку")
print(self.extras())
# ...а изменяемые шаги — это абстрактные методы.
@abstractmethod
def brew(self) -> str: ...
@abstractmethod
def extras(self) -> str: ...
class Tea(Drink):
def brew(self) -> str:
return "заварить чайные листья"
def extras(self) -> str:
return "добавить лимон"
class Coffee(Drink):
def brew(self) -> str:
return "пропустить воду через кофе"
def extras(self) -> str:
return "добавить молоко"
Tea().make("чай")
Coffee().make("кофе")
Когда его использовать
Используйте его, когда несколько процедур имеют одну и ту же фиксированную последовательность с разными деталями — генерация отчётов, конвейеры импорта, подготовка тестов.
Не используйте его, когда вариантам нужен ещё и разный порядок — если втиснуть их в один скелет, паттерн будет гнуться, пока не сломается. А если вариант всего один, скелет — это просто функция.
Плюсы и минусы
Плюсы: последовательность задаётся в одном месте; варианты не могут забыть или перепутать шаги; общие шаги пишутся один раз.
Минусы: жёсткость заложена в самой идее — вариант, которому нужно «почти то же самое, но...», борется со скелетом; слишком много методов-хуков делают рецепт трудным для понимания.