Skip to content

Применимость и шаги реализации Strategy

Во-первых, этот паттерн подойдет, когда тебе нужно использовать разные вариации какого-то алгоритма внутри одного объекта.

Стратегия позволяет варьировать поведение объекта во время выполнения программы, подставляя в него различные объекты-поведения (например, отличающиеся балансом скорости и потребления ресурсов).

Во-вторых, этот паттерн может использоваться, когда у тебя есть множество похожих классов, различающихся только некоторым поведением.

Стратегия позволяет вынести отличающееся поведение в отдельную иерархию классов, а затем свести первоначальные классы к одному, сделав поведение этого класса настраиваемым.

В-третьих, Strategy применима, когда ты не хочешь обнажать детали реализации алгоритмов для других классов.

Она позволяет изолировать код, данные и зависимости алгоритмов от других объектов, скрыв эти детали внутри классов-стратегий.

В-четвертых, стратегию можно использовать, когда различные вариации алгоритмов реализованы в виде развесистого условного оператора. Каждая ветка такого оператора представляет собой вариацию алгоритма.

Стратегия помещает каждую лапу  такого оператора в отдельный класс-стратегию. Затем контекст получает определённый объект-стратегию от клиента и делегирует ему работу. Если вдруг понадобится сменить алгоритм, в контекст можно подать другую стратегию.

Шаги реализации паттерна

  1. Определи алгоритм, который подвержен частым изменениям. Также подойдёт алгоритм, имеющий несколько вариаций, которые выбираются во время выполнения программы.
  2. Создай интерфейс стратегий, описывающий этот алгоритм. Он должен быть общим для всех вариантов алгоритма.
  3. Помести вариации алгоритма в собственные классы, которые реализуют этот интерфейс.
  4. В классе контекста создай поле для хранения ссылки на текущий объект-стратегию, а также метод для её изменения. Убедись в том, что контекст работает с этим объектом только через общий интерфейс стратегий.
  5. Клиенты контекста должны подавать в него соответствующий объект-стратегию, когда хотят, чтобы контекст вёл себя определённым образом.

Преимущества и недостатки паттерна

+ Горячая замена алгоритмов на лету.

+ Изоляция кода и данных алгоритмов от остальных классов.

+ Уход от наследования к делегированию.

+ Реализация принципа открытости/закрытости.

— Усложнение программы за счёт дополнительных классов.

— Клиент должен знать, в чём состоит разница между стратегиями, чтобы выбрать подходящую.