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

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Описание)
(Варианты)
 
(не показано 7 промежуточных версий этого же участника)
Строка 15: Строка 15:
 
=== Реализация ===
 
=== Реализация ===
 
==== Диаграмма классов ====
 
==== Диаграмма классов ====
[[Изображение:.png|.png]]
+
[[Изображение:StrategyCommon.png]]
  
 
==== Участники====
 
==== Участники====
*
+
* '''StrategyClient''' - содержит ссылку на текущий экземпляр класса Strategy и имеет метод для замены текущего экземпляра другим
 +
* '''Strategy''' - интерфейс, определяющий заголовки алгоритмов
 +
* '''ConcreteStrategy''' - классы, реализующие интерфейс Strategy для определения конкретных алгоритмов
  
==== Диаграмма последовательности ====
+
=== Пример ===
[[Изображение:.png]]
+
<source lang="Csharp">
 +
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();
 +
    }
 +
}
 +
</source>
  
 
=== Достоинства и недостатки ===
 
=== Достоинства и недостатки ===
*  
+
* При добавлении новых типов алгоритмов приложение просто расширяется, т.к. нет необходимости переписывать код всего приложения.
 +
* Можно заменить алгоритм динамически во время выполнения приложения.
 +
* Паттерн Стратегия позволяет обойтись без оператора 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 по типу алгоритма в коде.
  • Недостаток: для разных алгоритмов могут быть разное количество начальных параметров

Варианты

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