-
Notifications
You must be signed in to change notification settings - Fork 3
Strategy
Pandas edited this page Jun 20, 2017
·
1 revision
Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Стратегия позволяет изменять алгоритмы независимо от клиентов, которые ими пользуются.
Используйте паттерн стратегия, когда:
- Имеется много родственных классов, отличающихся только поведением.
- Вам нужно иметь несколько разных вариантов алгоритма.
- В алгоритме содержатся данные, о которых клиент не должен «знать». Используйте паттерн стратегия, чтобы не раскрывать сложные, специфичные для алгоритма структуры данных;
- В классе определено много поведений, что представлено разветвленными условными операторами. В этом случае проще перенести код из ветвей в отдельные классы стратегий.
- Strategy - стратегия: объявляет общий для всех поддерживаемых алгоритмов интерфейс. Класс Context пользуется этим интерфейсом для вызова конкретного алгоритма, определенного в классе ConcreteStrategy;
- ConcreteStrategy - конкретная стратегия: реализует алгоритм, использующий интерфейс, объявленный в классе Strategy;
- Context - контекст: конфигурируется объектом класса ConcreteStrategy; хранит ссылку на объект класса Strategy; может определять интерфейс, который позволяет объекту Strategy получить доступ к данным контекста.
- классы Strategy и Context взаимодействуют для реализации выбранно го алгоритма. Контекст может передать стратегии все необходимые алгорит му данные в момент его вызова. Вместо этого контекст может позволить об ращаться к своим операциям в нужные моменты, передав ссылку на самого себя операциям класса Strategy;
- контекст переадресует запросы своих клиентов объекту стратегии. Обычно клиент создает объект ConcreteStrategy и передает его контексту, после чего клиент «общается» исключительно с контекстом. Часто в распоряже нии клиента находится несколько классов ConcreteStrategy, которые он может выбирать.
У паттерна стратегия есть следующие достоинства и недостатки:
- Семейства родственных алгоритмов.
- Альтернатива порождению подклассов.
- С помощью стратегий можно избавиться от условных операторов. Благодаря паттерну стратегия удается отказаться от условных операторов при выборе нужного поведения.
- Выбор реализации. Стратегии могут предлагать различные реализации одного и того же поведения.
- Клиенты должны знать о различных стратегиях.
- Обмен информацией между стратегией и контекстом.
- Увеличение числа объектов.
