Skip to content

Strategy

Pandas edited this page Jun 20, 2017 · 1 revision

Назначение

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

Применение

Используйте паттерн стратегия, когда:

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

Структура

Imgur

Участники

  • Strategy - стратегия: объявляет общий для всех поддерживаемых алгоритмов интерфейс. Класс Context пользуется этим интерфейсом для вызова конкретного алгоритма, определенного в классе ConcreteStrategy;
  • ConcreteStrategy - конкретная стратегия: реализует алгоритм, использующий интерфейс, объявленный в классе Strategy;
  • Context - контекст: конфигурируется объектом класса ConcreteStrategy; хранит ссылку на объект класса Strategy; может определять интерфейс, который позволяет объекту Strategy получить доступ к данным контекста.

Отношения

  • классы Strategy и Context взаимодействуют для реализации выбранно го алгоритма. Контекст может передать стратегии все необходимые алгорит му данные в момент его вызова. Вместо этого контекст может позволить об ращаться к своим операциям в нужные моменты, передав ссылку на самого себя операциям класса Strategy;
  • контекст переадресует запросы своих клиентов объекту стратегии. Обычно клиент создает объект ConcreteStrategy и передает его контексту, после чего клиент «общается» исключительно с контекстом. Часто в распоряже нии клиента находится несколько классов ConcreteStrategy, которые он может выбирать.

Результаты

У паттерна стратегия есть следующие достоинства и недостатки:

  • Семейства родственных алгоритмов.
  • Альтернатива порождению подклассов.
  • С помощью стратегий можно избавиться от условных операторов. Благодаря паттерну стратегия удается отказаться от условных операторов при выборе нужного поведения.
  • Выбор реализации. Стратегии могут предлагать различные реализации одного и того же поведения.
  • Клиенты должны знать о различных стратегиях.
  • Обмен информацией между стратегией и контекстом.
  • Увеличение числа объектов.

Clone this wiki locally