Стратегия (Strategy) — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Admin (обсуждение | вклад) (→Пример) |
Admin (обсуждение | вклад) (→Варианты) |
||
(не показаны 3 промежуточные версии этого же участника) | |||
Строка 18: | Строка 18: | ||
==== Участники==== | ==== Участники==== | ||
− | * | + | * '''StrategyClient''' - содержит ссылку на текущий экземпляр класса Strategy и имеет метод для замены текущего экземпляра другим |
+ | * '''Strategy''' - интерфейс, определяющий заголовки алгоритмов | ||
+ | * '''ConcreteStrategy''' - классы, реализующие интерфейс Strategy для определения конкретных алгоритмов | ||
=== Пример === | === Пример === | ||
Строка 68: | Строка 70: | ||
=== Достоинства и недостатки === | === Достоинства и недостатки === | ||
− | * | + | * При добавлении новых типов алгоритмов приложение просто расширяется, т.к. нет необходимости переписывать код всего приложения. |
+ | * Можно заменить алгоритм динамически во время выполнения приложения. | ||
+ | * Паттерн Стратегия позволяет обойтись без оператора switch по типу алгоритма в коде. | ||
+ | * Недостаток: для разных алгоритмов могут быть разное количество начальных параметров | ||
=== Варианты === | === Варианты === | ||
− | * | + | * Отсутствуют |
Текущая версия на 20:31, 22 июля 2014
Другое название
Policy (Политика)
Назначение
Определяет семейство алгоритмов, делает их взаимозаменяемыми
Описание
Жестко зашивать в клиент тот или иной алгоритм плохо: клиент усложняется, сопровождать его труднее.
В зависимости от обстоятельств стоит применять тот или иной алгоритм.
Модификация самого алгоритма проще когда он вынесен в отдельный класс.
Реализация
Диаграмма классов
Участники
- 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 по типу алгоритма в коде.
- Недостаток: для разных алгоритмов могут быть разное количество начальных параметров
Варианты
- Отсутствуют