•  定义

  定义一系列算法(algorithms family),将每一个算法封装起来,并让它们可以互相替换(interchangeable)。策略模式让算法独立于使用它的客户而变化。

  UML类图如下:

  二十四.行为型设计模式——Strategy Pattern(策略模式)

  其中类和对象的关系为:

  1.Strategy(抽象策略类):定义一个公共的接口给所有支持的算法。Context使用这个接口调用ContextStrategy定义的算法。

  2.ContextStrategy(具体策略类):调用Strategy接口实现具体的算法。

  3.Context(场景):用ContextStrategy对象配置其执行的环境;维护一个对Strategy的引用实例;可以定义一个接口供Strategy存取其数据。

  典型应用的顺序图如下:  

  二十四.行为型设计模式——Strategy Pattern(策略模式)

  • 实例1——排序方法

  下面的实例演示了策略模式为多个对象封装了不同的排序算法,允许客户动态改变不同的排序策略,包括Quicksort排序法、Shellsort排序法和Mergesort排序法。类图如下:

  二十四.行为型设计模式——Strategy Pattern(策略模式)

  

View Code
namespace ConsoleApplication
{
//抽象排序策略类
abstract class SortStrategy
{
abstract public void Sort(ArrayList list);
}
//具体策略 快速排序
class QuickSort : SortStrategy
{
public override void Sort(ArrayList list)
{
list.Sort(); //ArrayList的Sort默认采用快排
Console.WriteLine("快速排序");
}
}
//具体策略 外壳排序法
class ShellSort : SortStrategy
{
public override void Sort(ArrayList list)
{
//list.ShellSort(); //方法省略
Console.WriteLine("外壳排序法");
}
}
//具体策略 混合排序
class MergeSort : SortStrategy
{
public override void Sort(ArrayList list)
{
//list.MergeSort(); //方法省略
Console.WriteLine("MergeSort");
}
}

//场景
class SortedList
{
private ArrayList list = new ArrayList();
private SortStrategy sortStrategy;
//设定排序方法,传入排序策略对象
public void SetSortStrategy(SortStrategy sortStrategy)
{
this.sortStrategy = sortStrategy;
}
//采用传入的排序策略对象排序
public void Sort()
{
sortStrategy.Sort(list);
}
//增加要排的元素
public void Add(string name)
{
list.Add(name);
}
public void Display()
{
foreach (string name in list)
Console.WriteLine("" + name);
}
}

class Program
{
static void Main(string[] args)
{
SortedList studentRecords = new SortedList();
studentRecords.Add("Samual");
studentRecords.Add("Jimmy");
studentRecords.Add("Sandra");
studentRecords.Add("Anna");
studentRecords.Add("Vivek");
//采用快速排序法排序
studentRecords.SetSortStrategy(new QuickSort());
studentRecords.Sort();
studentRecords.Display();
Console.Read();
}
}
}
  • 优势和缺陷

  策略模式提供了替代派生的子类,并定义类的每个行为,剔除了代码中条件的判断语句,使得扩展和结合新的行为变得更容易,根本不需要变动应用程序。策略模式可以避免使用多重条件转移语句,系统变得更新灵活。应用策略模式会产生很多子类,这符合高内聚的责任分配模式。

  • 应用情景

  下面的情景很适合应用策略模式:

  1.多个类的分别只是在于行为不同。

  2.你需要对行为的算法作很多变动。

  3.客户不知道算法要使用的数据。

分类:

技术点:

相关文章: