Назначение: определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми, позволяет изменять алгоритмы независимо от клиентов, которые ими пользуются.
Общая структура решения.
Strategy – стратегия: объявляет общий для всех поддерживаемых алгоритмов интерфейс. Класс Context пользуется этим интерфейсом для вызова конкретного алгоритма, определенного в классе ConcreteStrategy.
ConcreteStrategy – конкретные стратегии: реализуют алгоритмы, использующие интерфейс, объявленный в классе Strategy.
Context – контекст: хранит ссылку на объект класса Strategy, которая конфигурируется конкретным объектом. Может определять интерфейс, который позволяет объекту Strategy получить доступ к данным контекста.
Классы Strategy и Context взаимодействуют для реализации выбранного алгоритма. Контекст может передать стратегии все необходимые алгоритму данные в момент его вызова. Либо вместо этого контекст может позволить стратегии обращаться к своим операциям в нужные моменты, передав ей ссылку на самого себя.
Контекст переадресует запросы своих клиентов объекту-стратегии. Обычно клиент создает объект ConcreteStrategy и передает его контексту, после чего клиент общается исключительно с контекстом. При этом в распоряжении клиента находится несколько классов ConcreteStrategy, которые он может выбирать.