Что это такое
Паттерн Strategy делает алгоритм заменяемым: окружающий код остаётся прежним, а взаимозаменяемая часть — как считать цену, как сортировать, как сжимать — подставляется как значение.
В TypeScript стратегию можно записать двумя способами: как класс, реализующий интерфейс, или как обычный тип функции. На этой странице используется тип функции, потому что здесь стратегия — это один расчёт без собственного состояния: type Pricing = (price: number) => number и присваивание — это весь механизм.
Пример: заменяемый расчёт цены
Класс Shop не меняется; правило расчёта цены — это значение-функция в поле. Обычная цена, «Чёрная пятница», скидка для участника — три функции, один магазин.
Стратегия — это значение-функция
Три покупки одной и той же цены 50 дают три итога — 50.00, 35.00 и 45.00 — и отличается только присвоенная функция. Точно так же работает и сортировка: array.sort(compare) принимает стратегию сравнения.
Вывод: программа на TypeScript и захваченный вывод
// Стратегия — это тип функции: подходит любая функция с таким же видом.
type Pricing = (price: number) => number
const regular: Pricing = (price) => price
const blackFriday: Pricing = (price) => price * 0.7
const member: Pricing = (price) => price - 5
class Shop {
pricing: Pricing
constructor(pricing: Pricing) {
this.pricing = pricing
}
checkout(price: number): void {
console.log("итого:", this.pricing(price).toFixed(2))
}
}
const shop = new Shop(regular)
shop.checkout(50)
shop.pricing = blackFriday
shop.checkout(50)
shop.pricing = member
shop.checkout(50)
Когда использовать
Используйте, когда алгоритм меняется, а его окружение — нет: правила расчёта цены, политики повторных попыток, порядки сортировки, режимы проверки.
Не используйте, когда алгоритм один и второй реально не нужен. Форму с интерфейсом и классом вместо функции берите только тогда, когда стратегии нужно собственное состояние или несколько методов.
Плюсы и минусы
Плюсы: поведение заменяется во время выполнения; каждая стратегия мала и проверяется отдельно; в виде типа функции она почти бесплатна — один псевдоним типа и присваивание.
Минусы: выбранная стратегия не видна в месте вызова — отладка означает поиск того, что было присвоено; слишком много мелких стратегий дробят простую логику.