Перейти к основному содержимому

Что это такое

Паттерн Шаблонный метод (Template Method) фиксирует скелет алгоритма — шаги и их порядок, — но позволяет отдельным шагам меняться. Рецепт пишется один раз; каждый вариант заполняет свои собственные шаги.

В Python скелет находится в настоящем базовом классе: abc.ABC. Это единственный паттерн, где базовый класс лучше протокола, потому что базовый класс должен содержать общий метод-скелет, а не просто описывать форму.


Пример: один рецепт, два напитка

make() управляет порядком: вскипятить, заварить, налить, добавки. Чай и кофе отвечают только на вопросы, как заваривать и что добавить, — они не могут менять порядок шагов или пропускать их.

Скелет остаётся неизменным

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

Prompt
Напишите программу на Python с паттерном «Шаблонный метод»: абстрактный базовый класс Drink, метод make которого выполняет фиксированный скелет (вскипятить, заварить, налить, добавки) и выводит каждый шаг, с абстрактными методами brew и extras, а также дочерние классы Tea и Coffee, которые заполняют изменяемые шаги. Приготовьте оба напитка.
Вывод: полная программа на Python

Когда его использовать

Используйте его, когда несколько процедур имеют одну и ту же фиксированную последовательность с разными деталями — генерация отчётов, конвейеры импорта, подготовка тестов.

Не используйте его, когда вариантам нужен ещё и разный порядок — если втиснуть их в один скелет, паттерн будет гнуться, пока не сломается. А если вариант всего один, скелет — это просто функция.


Плюсы и минусы

Плюсы: последовательность задаётся в одном месте; варианты не могут забыть или перепутать шаги; общие шаги пишутся один раз.

Минусы: жёсткость заложена в самой идее — вариант, которому нужно «почти то же самое, но...», борется со скелетом; слишком много методов-хуков делают рецепт трудным для понимания.