Что это такое
Паттерн Template Method фиксирует скелет алгоритма — шаги и их порядок, — позволяя отдельным шагам различаться. Рецепт написан один раз; каждый вариант заполняет свои собственные шаги.
В TypeScript это записывается с помощью abstract-класса. Скелет — это обычный метод базового класса; изменяемые шаги — это abstract-методы без тела, поэтому каждый подкласс обязан их предоставить, а базовый класс нельзя создать сам по себе.
Пример: один рецепт, два напитка
make() владеет порядком: вскипятить, заварить, налить, добавки. Tea и Coffee отвечают только на вопросы как заваривать и что добавить — они не могут переставить или пропустить шаги.
Скелет остаётся неизменным
Оба напитка печатают одни и те же четыре шага в одном и том же порядке, потому что порядок живёт в одном методе: вскипятить воду, строка заваривания, налить в чашку, строка добавок. Новый напиток реализует два метода и наследует всю дисциплину.
Вывод: программа на TypeScript и захваченный вывод
abstract class Drink {
private label: string
constructor(label: string) {
this.label = label
}
// Фиксированный скелет: порядок шагов живёт здесь, один раз.
make(): void {
console.log("--", this.label)
console.log("вскипятить воду")
console.log(this.brew())
console.log("налить в чашку")
console.log(this.extras())
}
// Изменяемые шаги: каждый напиток обязан их заполнить.
protected abstract brew(): string
protected abstract extras(): string
}
class Tea extends Drink {
constructor() {
super("чай")
}
protected brew(): string {
return "заварить чайные листья"
}
protected extras(): string {
return "добавить лимон"
}
}
class Coffee extends Drink {
constructor() {
super("кофе")
}
protected brew(): string {
return "пропустить воду через кофе"
}
protected extras(): string {
return "добавить молоко"
}
}
new Tea().make()
new Coffee().make()
Когда это использовать
Используйте, когда несколько процедур разделяют одну и ту же фиксированную последовательность с разными деталями — генерация отчётов, конвейеры импорта, подготовка тестов.
Откажитесь, когда вариантам нужен ещё и разный порядок — попытка втиснуть их в один скелет гнёт паттерн, пока он не сломается. А с одним вариантом скелет — это просто функция.
Плюсы и минусы
Плюсы: последовательность задаётся в одном месте; варианты не могут забыть или перемешать шаги; общие шаги написаны один раз; забытый шаг — это ошибка компиляции, а не сюрприз во время выполнения.
Минусы: жёсткость по замыслу — вариант, которому нужно «почти то же самое, но...», борется со скелетом; слишком много методов-хуков делают рецепт трудным для понимания.