Применимость и шаги реализации Strategy
Во-первых, этот паттерн подойдет, когда тебе нужно использовать разные вариации какого-то алгоритма внутри одного объекта.
Стратегия позволяет варьировать поведение объекта во время выполнения программы, подставляя в него различные объекты-поведения (например, отличающиеся балансом скорости и потребления ресурсов).
Во-вторых, этот паттерн может использоваться, когда у тебя есть множество похожих классов, различающихся только некоторым поведением.
Стратегия позволяет вынести отличающееся поведение в отдельную иерархию классов, а затем свести первоначальные классы к одному, сделав поведение этого класса настраиваемым.
В-третьих, Strategy применима, когда ты не хочешь обнажать детали реализации алгоритмов для других классов.
Она позволяет изолировать код, данные и зависимости алгоритмов от других объектов, скрыв эти детали внутри классов-стратегий.
В-четвертых, стратегию можно использовать, когда различные вариации алгоритмов реализованы в виде развесистого условного оператора. Каждая ветка такого оператора представляет собой вариацию алгоритма.
Стратегия помещает каждую лапу такого оператора в отдельный класс-стратегию. Затем контекст получает определённый объект-стратегию от клиента и делегирует ему работу. Если вдруг понадобится сменить алгоритм, в контекст можно подать другую стратегию.
Шаги реализации паттерна
- Определи алгоритм, который подвержен частым изменениям. Также подойдёт алгоритм, имеющий несколько вариаций, которые выбираются во время выполнения программы.
- Создай интерфейс стратегий, описывающий этот алгоритм. Он должен быть общим для всех вариантов алгоритма.
- Помести вариации алгоритма в собственные классы, которые реализуют этот интерфейс.
- В классе контекста создай поле для хранения ссылки на текущий объект-стратегию, а также метод для её изменения. Убедись в том, что контекст работает с этим объектом только через общий интерфейс стратегий.
- Клиенты контекста должны подавать в него соответствующий объект-стратегию, когда хотят, чтобы контекст вёл себя определённым образом.
Преимущества и недостатки паттерна
+ Горячая замена алгоритмов на лету. + Изоляция кода и данных алгоритмов от остальных классов. + Уход от наследования к делегированию. + Реализация принципа открытости/закрытости. | — Усложнение программы за счёт дополнительных классов. — Клиент должен знать, в чём состоит разница между стратегиями, чтобы выбрать подходящую. |