Strategy — выбор алгоритма во время выполнения системы
Strategy позволяет выделять алгоритмы в отдельные независимые объекты и подменять их динамически, не изменяя основной код. Это решает проблему жёстких условных конструкций и делает логику системы гибкой, конфигурируемой и расширяемой.
Паттерн применяется в бизнес-правилах, расчётах тарифов, интеграциях, выборе политики, подборе стратегий обработки, роутинге, принятии решений и адаптации поведения под контекст.
Strategy используется архитекторами для динамической подстановки алгоритмов, настройки поведения системы и уменьшения связанности между компонентами.
Strategy — один из самых востребованных паттернов в архитектуре ИС, так как бизнес постоянно требует изменяемых правил, вычислений и действий, зависящих от контекста. Использование Strategy превращает архитектуру в гибкую систему, где алгоритмы можно выбирать, комбинировать, расширять и активировать без изменения базового кода.
Главная идея Strategy
Strategy выделяет алгоритм в отдельный объект, а затем позволяет:
-
подменять алгоритм на лету;
-
выбирать стратегию по конфигурации;
-
внедрять новые алгоритмы без изменения существующих;
-
менять поведение системы в зависимости от контекста.
Текущий алгоритм выбирается в рантайме, а система остаётся чистой и модульной.
Где Strategy применяется в архитектуре
1. Тарифы, расчёты, правила ценообразования
Например, разные алгоритмы расчёта цены:
-
фиксированная скидка;
-
процентная скидка;
-
комплексные тарифы;
-
акции;
-
зависящие от сегмента клиента.
Архитектор использует Strategy, чтобы эти алгоритмы были независимыми.
2. Политики (policy-based design)
Типичные политики:
-
политика выбора сервера;
-
политика кеширования;
-
политика ретраев;
-
политика безопасности;
-
политика маршрутизации.
Стратегии позволяют легко добавлять новые политики.
3. Интеграции и адаптеры
Если интеграция требует:
-
разные методы авторизации,
-
разные способы сериализации,
-
разные схемы обработки ошибок,
-
разные подходы к ретраю,
Архитектор выделяет каждую как Strategy.
4. Выбор алгоритма обработки данных
Например:
-
разные регуляторы обработки;
-
разные алгоритмы валидации;
-
разные стратегии сохранения;
-
разные способы парсинга;
-
разные методы агрегации.
5. Оптимизация поведения системы
Strategy позволяет выбирать:
-
алгоритм сортировки;
-
стратегию кеширования;
-
метод поиска пути;
-
стратегию реконнекта;
-
метод шардирования и репликации.
6. Конфигурация систем
Часто стратегии выбираются:
-
из БД,
-
из конфига,
-
из внешнего API,
-
через правило (Interpreter),
-
через событийный механизм.
Это позволяет бизнесу менять поведение без публикации новой версии программы.
Преимущества Strategy
1. Устранение условных операторов
Огромные if-else заменяются выбором соответствующей стратегии.
2. Поддерживаемость
Новый алгоритм = новый класс/модуль → систему менять не нужно.
3. Тестируемость
Каждая стратегия тестируется отдельно.
4. Расширяемость
Архитектор может добавлять:
-
новые алгоритмы,
-
новые правила выбора алгоритма,
-
новые типы поведения.
5. Снижение связанности
Контекст не знает, какой алгоритм выполняется — только стратегию.
Типичные ошибки (и как их избежать)
-
слишком маленькие стратегии → объединять логические части;
-
непонятные правила выбора стратегии → необходимо явное описание logic selector;
-
слишком много стратегий → использовать композицию стратегий (pipeline strategy);
-
попытка реализовать DSL внутри Strategy → Strategy ≠ Interpreter;
-
слишком жёсткая привязка к DI-контейнеру → держать интерфейсы максимально чистыми.
Strategy в российских учебниках по архитектуре
Strategy рассматривается как основной способ:
-
уменьшения зацепления модулей;
-
выделения бизнес-алгоритмов;
-
проектирования конфигурируемых систем;
-
реализации гибкого поведения подсистем;
-
применения принципа "открыт для расширения, закрыт для изменений".
Особенно в темах:
-
проектирование прикладной логики;
-
проектирование подсистем;
-
моделирование бизнес-правил;
-
адаптационные механизмы ИС.
Почему Strategy — обязательный навык архитектора
Потому что современные системы:
-
должны быстро адаптироваться;
-
должны менять алгоритмы без деплоя;
-
должны конфигурироваться под клиента;
-
должны легко расширяться;
-
должны быть управляемыми.
Strategy — фундамент для гибкой архитектуры, которая умеет жить в условиях постоянных изменений.