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

Что это такое

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

В TypeScript стратегию можно записать двумя способами: как класс, реализующий интерфейс, или как обычный тип функции. На этой странице используется тип функции, потому что здесь стратегия — это один расчёт без собственного состояния: type Pricing = (price: number) => number и присваивание — это весь механизм.


Пример: заменяемый расчёт цены

Класс Shop не меняется; правило расчёта цены — это значение-функция в поле. Обычная цена, «Чёрная пятница», скидка для участника — три функции, один магазин.

Стратегия — это значение-функция

Три покупки одной и той же цены 50 дают три итога — 50.00, 35.00 и 45.00 — и отличается только присвоенная функция. Точно так же работает и сортировка: array.sort(compare) принимает стратегию сравнения.

Prompt
Напишите программу на TypeScript с паттерном «Стратегия», используя тип функции: тип Pricing, который принимает и возвращает число, три стратегии (обычная цена, «Чёрная пятница» со скидкой 30% и скидка для участника минус 5) и класс Shop, который хранит текущую функцию расчёта цены и использует её в методе checkout, печатающем итог с двумя знаками после запятой. Оформите покупку одной и той же цены со всеми тремя стратегиями.
Вывод: программа на TypeScript и захваченный вывод

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

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

Не используйте, когда алгоритм один и второй реально не нужен. Форму с интерфейсом и классом вместо функции берите только тогда, когда стратегии нужно собственное состояние или несколько методов.


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

Плюсы: поведение заменяется во время выполнения; каждая стратегия мала и проверяется отдельно; в виде типа функции она почти бесплатна — один псевдоним типа и присваивание.

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