P_Strategy - melnikf/teaching GitHub Wiki
Стратегия
Связанные алгоритмы инкапсулируются в классах, реализующих общий интерфейс. Это позволяет выбирать алгоритм путем определения со ответствущего класса. Кроме того, этот шаблон со временем позволяет изменять выбор алгоритма.
Введение интерфейса позволяет классам-клиентам ничего не знать о классах, реализующих этот интерфейс и инкапсулирующих в себе конкретные алгоритмы.
Когда использовать
- программа должна обеспечивать различные варианты алгоритма или поведения;
- нужно изменять поведение каждого экземпляра класса;
- необходимо изменять состояние объектов на этапе выполнения.
Когда не использовать
- если поведение экземпляров класса не изменяется при переходе от одного экземпляра к другому или с течением времени.
В этом случае самый простой выход для класса состоит в том, чтобы непосредственно реализовать эту схему своего поведения или непосредственно содержать статическую ссылку на реализующий алгоритм класс.
Диаграмма классов
Client
Класс в роли Client делегирует операцию интерфейсу. При этом он ничего не знает о реальном классе объекта, которому он делегирует операцию, или о том, каким образом этот класс реализует операцию.
IStrategy
Интерфейс в этой роли обеспечивает общий способ доступа к операциям, инкапсулированным в его подклассах.
ConcreteStrategy1, ConcreteStrategy2...
Классы в этой роли предоставляют альтернативные варианты реализации операции, которую делегирует класс Client.
Шаблон Strategy всегда используется вместе с механизмом для определения реального объекта ConcreteStrategy, который будет использоваться объектом Client. Выбор стратегии часто обусловлен информацией о конфигурации или событиями. Реальный механизм может меняться весьма значительно, поэтому ни один конкретный механизм выбора стратегии в шаблон не включен.