Strategy Pattern

Design Patterns
in C#
Strategy Pattern
www.devbg.org/patternscourse/
Михаил Стойнов
Siemens AG
Strategy Pattern
• Доста често използван
• По дефиниция:
• Дефиниране на група алгоритми и
капсулирането им. Правенето на всеки
алгоритъм заменим с другите.
• Могат всички да работят с едни и същи
данни прозрачно
• Клиентът може да работи прозрачно с
всеки алгоритъм
Термини
• Контекст – този, който може да
извлече полза от няколко алгоритъма
• Пример: SortedList
Термини
• Стратегия – дефинира условията, при
които трябва да работи алгоритъма
• Пример: interface SortStrategy
Термини
• Конкретна стратегия – имплементация
на конкретен алгоритъм
• Пример: QuickSort, MergeSort
Имплементация
class Context
{
Strategy strategy;
// Constructor
public Context(Strategy strategy)
{
this.strategy = strategy;
}
public void ContextInterface()
{
strategy.ExecuteAlgorithm();
}
}
Имплементация
abstract class Strategy
{
public abstract void ExecuteAlgorithm();
}
Имплементация
// "ConcreteStrategyA“
class ConcreteStrategyA : Strategy
{
public override void ExecuteAlgorithm()
{
Console.WriteLine(
"Called ConcreteStrategyA.ExecuteAlgorithm()");
}
}
// "ConcreteStrategyB“
class ConcreteStrategyB : Strategy
{
public override void ExecuteAlgorithm()
{
Console.WriteLine(
"Called ConcreteStrategyB.ExecuteAlgorithm()");
}
}
// "ConcreteStrategyC“ ...
Имплементация
• Резултат:
Called ConcreteStrategyA.ExecuteAlgorithm()
Called ConcreteStrategyB.ExecuteAlgorithm()
Called ConcreteStrategyC.ExecuteAlgorithm()
Real-world case
// "Context“
class SortedList
{
private ArrayList list = new ArrayList();
private SortStrategy sortstrategy;
public void SetSortStrategy(SortStrategy strategy)
{
this.sortstrategy = strategy;
}
public void Sort()
{
sortstrategy.Sort(list);
// Display results
…
}
}
Real-world case
// "Strategy“
abstract class SortStrategy
{
public abstract void Sort(ArrayList list);
}
// "ConcreteStrategyA“
class QuickSort : SortStrategy
{
public override void Sort(ArrayList list)
{
// Quicksorting
Console.WriteLine("QuickSorted list");
}
}
// "ConcreteStrategyB“...
Демонстрация
• Демо1
Друг пример
Друг пример
Използвана литература
• http://www.dofactory.com/Patterns/Patter
nStrategy.aspx
• http://en.wikipedia.org/wiki/Strategy_patt
ern
Въпроси?
www.devbg.org/patternscourse/
Михаил Стойнов
Siemens AG