Стратегия (Strategy)

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск

К основной странице курса

Другое название

Policy (Политика)

Назначение

Определяет семейство алгоритмов, делает их взаимозаменяемыми

Описание

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

В зависимости от обстоятельств стоит применять тот или иной алгоритм.

Модификация самого алгоритма проще когда он вынесен в отдельный класс.

Реализация

Диаграмма классов

StrategyCommon.png

Участники

  • StrategyClient - содержит ссылку на текущий экземпляр класса Strategy и имеет метод для замены текущего экземпляра другим
  • Strategy - интерфейс, определяющий заголовки алгоритмов
  • ConcreteStrategy - классы, реализующие интерфейс Strategy для определения конкретных алгоритмов

Пример

interface Strategy
{
    void Operation();
}

class ConcreteStrategyA : Strategy
{
    public void Operation()
    {
        // ...
    }
}

class ConcreteStrategyB : Strategy
{
    public void Operation()
    {
        // ...
    }
}

class ConcreteStrategyC : Strategy
{
    public void Operation()
    {
        // ...
    }
}

class StrategyClient
{
    Strategy strategy;

    public Context(Strategy strategy)
    {
        this.strategy = strategy;
    }

    public void PerformOperation()
    {
        strategy.Operation();
    }
}

Достоинства и недостатки

  • При добавлении новых типов алгоритмов приложение просто расширяется, т.к. нет необходимости переписывать код всего приложения.
  • Можно заменить алгоритм динамически во время выполнения приложения.
  • Паттерн Стратегия позволяет обойтись без оператора switch по типу алгоритма в коде.
  • Недостаток: для разных алгоритмов могут быть разное количество начальных параметров

Варианты

  • Отсутствуют