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

Что это такое

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

Именно этот паттерн Go упрощает сильнее всего: поскольку функции здесь являются значениями, стратегия часто оказывается просто типом-функцией. Ни интерфейса, ни структуры — присваиваете другую функцию, и поведение меняется.


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

Checkout не меняется никогда; правило расчёта цены — это значение-функция в поле структуры. Обычная цена, Black Friday, скидка участника клуба — три функции, один магазин.

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

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

Prompt
Напишите программу на Go с паттерном Strategy в стиле Go: тип-функцию Pricing, три стратегии (обычная цена, Black Friday со скидкой 30%, участник клуба минус 5) и структуру Shop, которая хранит текущую функцию расчёта цены и использует её в методе Checkout. Оформите заказ с одной и той же ценой всеми тремя стратегиями.
Вывод: программа на Go и захваченный вывод

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

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

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


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

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

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