Стратегия (Strategy) — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Пример)
(Варианты)
 
(не показаны 4 промежуточные версии этого же участника)
Строка 18: Строка 18:
  
 
==== Участники====
 
==== Участники====
*
+
* '''StrategyClient''' - содержит ссылку на текущий экземпляр класса Strategy и имеет метод для замены текущего экземпляра другим
 +
* '''Strategy''' - интерфейс, определяющий заголовки алгоритмов
 +
* '''ConcreteStrategy''' - классы, реализующие интерфейс Strategy для определения конкретных алгоритмов
  
 
=== Пример ===
 
=== Пример ===
Строка 51: Строка 53:
 
}
 
}
  
class Context
+
class StrategyClient
 
{
 
{
 
     Strategy strategy;
 
     Strategy strategy;
Строка 68: Строка 70:
  
 
=== Достоинства и недостатки ===
 
=== Достоинства и недостатки ===
*  
+
* При добавлении новых типов алгоритмов приложение просто расширяется, т.к. нет необходимости переписывать код всего приложения.
 +
* Можно заменить алгоритм динамически во время выполнения приложения.
 +
* Паттерн Стратегия позволяет обойтись без оператора switch по типу алгоритма в коде.
 +
* Недостаток: для разных алгоритмов могут быть разное количество начальных параметров
  
 
=== Варианты ===
 
=== Варианты ===
*
+
* Отсутствуют

Текущая версия на 20:31, 22 июля 2014

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

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

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 по типу алгоритма в коде.
  • Недостаток: для разных алгоритмов могут быть разное количество начальных параметров

Варианты

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