您的位置:首页 > 其它

策略模式(Strategy)

2012-08-10 09:56 246 查看
1. 定义

它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
2. UML 类图



3. 结构代码

// Strategy pattern -- Structural example
using System;

namespace DoFactory.GangOfFour.Strategy.Structural
{
///<summary>
/// MainApp startup class for Structural
/// Strategy Design Pattern.
///</summary>
classMainApp
{
///<summary>
/// Entry point into console application.
///</summary>
staticvoid Main()
{
Context context;

// Three contexts following different strategies
context =
new Context(newConcreteStrategyA());
context.ContextInterface();

context =
new Context(newConcreteStrategyB());
context.ContextInterface();

context =
new Context(newConcreteStrategyC());
context.ContextInterface();

// Wait for user
Console.ReadKey();
}
}

///<summary>
/// The 'Strategy' abstract class
///</summary>
abstractclass
Strategy
{
publicabstract
void AlgorithmInterface();
}

///<summary>
/// A 'ConcreteStrategy' class
///</summary>
classConcreteStrategyA :
Strategy
{
publicoverride
void AlgorithmInterface()
{
Console.WriteLine(
"Called ConcreteStrategyA.AlgorithmInterface()");
}
}

///<summary>
/// A 'ConcreteStrategy' class
///</summary>
classConcreteStrategyB :
Strategy
{
publicoverride
void AlgorithmInterface()
{
Console.WriteLine(
"Called ConcreteStrategyB.AlgorithmInterface()");
}
}

///<summary>
/// A 'ConcreteStrategy' class
///</summary>
classConcreteStrategyC :
Strategy
{
publicoverride
void AlgorithmInterface()
{
Console.WriteLine(
"Called ConcreteStrategyC.AlgorithmInterface()");
}
}

///<summary>
/// The 'Context' class
///</summary>
classContext
{
privateStrategy _strategy;

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

publicvoid ContextInterface()
{
_strategy.AlgorithmInterface();
}
}
}

Output
Called ConcreteStrategyA.AlgorithmInterface()

Called ConcreteStrategyB.AlgorithmInterface()

Called ConcreteStrategyC.AlgorithmInterface()
4. 实例代码

// Strategy pattern -- Real World example
using System;

using System.Collections.Generic;

namespace DoFactory.GangOfFour.Strategy.RealWorld
{
///<summary>
/// MainApp startup class for Real-World
/// Strategy Design Pattern.
///</summary>
classMainApp
{
///<summary>
/// Entry point into console application.
///</summary>
staticvoid Main()
{
// Two contexts following different strategies
SortedList studentRecords =new
SortedList();

studentRecords.Add("Samual");
studentRecords.Add("Jimmy");
studentRecords.Add("Sandra");
studentRecords.Add("Vivek");
studentRecords.Add("Anna");

studentRecords.SetSortStrategy(newQuickSort());
studentRecords.Sort();

studentRecords.SetSortStrategy(newShellSort());
studentRecords.Sort();

studentRecords.SetSortStrategy(newMergeSort());
studentRecords.Sort();

// Wait for user
Console.ReadKey();
}
}

///<summary>
/// The 'Strategy' abstract class
///</summary>
abstractclass
SortStrategy
{
publicabstract
void Sort(List<string> list);
}

///<summary>
/// A 'ConcreteStrategy' class
///</summary>
classQuickSort :
SortStrategy
{
publicoverride
void Sort(List<string> list)
{
list.Sort(); // Default is Quicksort
Console.WriteLine("QuickSorted list ");
}
}

///<summary>
/// A 'ConcreteStrategy' class
///</summary>
classShellSort :
SortStrategy
{
publicoverride
void Sort(List<string> list)
{
//list.ShellSort(); not-implemented
Console.WriteLine("ShellSorted list ");
}
}

///<summary>
/// A 'ConcreteStrategy' class
///</summary>
classMergeSort :
SortStrategy
{
publicoverride
void Sort(List<string> list)
{
//list.MergeSort(); not-implemented
Console.WriteLine("MergeSorted list ");
}
}

///<summary>
/// The 'Context' class
///</summary>
classSortedList
{
privateList<string> _list =new
List<string>();
privateSortStrategy _sortstrategy;

publicvoid SetSortStrategy(SortStrategy sortstrategy)
{
this._sortstrategy = sortstrategy;
}

publicvoid Add(string name)
{
_list.Add(name);
}

publicvoid Sort()
{
_sortstrategy.Sort(_list);

// Iterate over list and display results
foreach (string namein _list)
{
Console.WriteLine(" " + name);
}
Console.WriteLine();
}
}
}

Output

QuickSorted list

Anna

Jimmy

Samual

Sandra

Vivek

ShellSorted list

Anna

Jimmy

Samual

Sandra

Vivek

MergeSorted list

Anna

Jimmy

Samual

Sandra

Vivek
该文章来自:http://www.dofactory.com/Patterns/PatternStrategy.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: