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

Общая структура решения.

 

 

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

ConcreteStrategy – конкретные стратегии: реализуют алгоритмы, использующие интерфейс, объявленный в классе Strategy.

Context – контекст: хранит ссылку на объект класса Strategy, которая конфигурируется конкретным объектом. Может определять интерфейс, который позволяет объекту Strategy получить доступ к данным контекста.

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

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