P_Strategy - melnikf/teaching GitHub Wiki

Стратегия

Связанные алгоритмы инкапсулируются в классах, реализующих общий интерфейс. Это позволяет выбирать алгоритм путем определения со ответствущего класса. Кроме того, этот шаблон со временем позволяет изменять выбор алгоритма.

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

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

  • программа должна обеспечивать различные варианты алгоритма или поведения;
  • нужно изменять поведение каждого экземпляра класса;
  • необходимо изменять состояние объектов на этапе выполнения.

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

  • если поведение экземпляров класса не изменяется при переходе от одного экземпляра к другому или с течением времени.

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

Диаграмма классов

diagram_strategy

Client

Класс в роли Client делегирует операцию интерфейсу. При этом он ничего не знает о реальном классе объекта, которому он делегирует операцию, или о том, каким образом этот класс реализует операцию.

IStrategy

Интерфейс в этой роли обеспечивает общий способ доступа к операциям, инкапсулированным в его подклассах.

ConcreteStrategy1, ConcreteStrategy2...

Классы в этой роли предоставляют альтернативные варианты реализации операции, которую делегирует класс Client.

Шаблон Strategy всегда используется вместе с механизмом для определения реального объекта ConcreteStrategy, который будет использоваться объектом Client. Выбор стратегии часто обусловлен информацией о конфигурации или событиями. Реальный механизм может меняться весьма значительно, поэтому ни один конкретный механизм выбора стратегии в шаблон не включен.