**定义:**策略模式(Strategy Pattern),定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。本模式使得算法可以独立于使用它的客户而变化。
类型:对象行为型模式。
概述:
策略模式是比较典型的对象行为型模式,它是将对处理对象的一系列不同算法都单独抽离出来,单独封装成一个个类。策略的出现,主要是为了解决不同算法替换时的逻辑判断,将逻辑判断移到Client中去。策略模式比较常见,但是也相对比较简单。
一系列算法,作为程序员,很容易就想到排序算法。那这里就以排序算法来举例了。有文本内容Context,如果录得的是乱序数据,那么排序最好选择快速排序(Quick Sort);如果是多部分都有序,只有个别数据随意插入其中,那么此时可以使用选择排序(Select Sort)。
类图:
![](https://box.kancloud.cn/2016-08-19_57b6b467b6109.jpg)
参与者:
1. Context,上下文,维护一个指向SortAlgo的指针,用来访问相应的排序算法。
1. SortAlgo,算法策略接口类,只是提供接口。
1. QuickSort、SelectSort,按照接口实现具体的算法。
示例代码:
~~~
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern22
{
// 抽象算法类
abstract class SortAlgo
{
//算法方法
public abstract void Sort();
}
// 快速排序算法
class QuickSort : SortAlgo
{
// 具体实现快速排序算法
public override void Sort()
{
Console.WriteLine("快速排序算法实现");
}
}
// 选择排序算法
class SelectSort : SortAlgo
{
// 具体实现选择排序算法
public override void Sort()
{
Console.WriteLine("选择排序算法实现");
}
}
//上下文
class Context
{
SortAlgo algo;
public Context(SortAlgo _algo)
{
this.algo = _algo;
}
//上下文接口
public void SortData()
{
algo.Sort();
}
}
class Program
{
static void Main(string[] args)
{
Context context;
// 当录入的是随机数据时,选择使用快速排序算法
context = new Context(new QuickSort());
context.SortData();
// 当录入一些比较有顺序的数据时,使用选择排序算法
context = new Context(new SelectSort());
context.SortData();
Console.Read();
}
}
}
~~~
适用性:
1. 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
1. 在需要新添加其他算法来实现时。
1. 对客户端隐藏具体算法的实现细节。
优缺点:
1. 优点,将判断的逻辑移到类外面,方便通过添加新类来完成新的算法。
1. 缺点,如果算法类过多,会对Client端调用不同算法的判断带来麻烦。
参考资料:
1. 《设计模式——可复用面向对象软件基础》
1. 《大话设计模式》
- 前言
- 设计模式六大原则
- 1——创建型模式之简单工厂模式
- 2——创建型模式之工厂方法模式
- 3——创建型模式之抽象工厂模式
- 4——创建型模式之单例模式
- 5——创建型模式之建造者模式
- 6——创建型模式之原型模式
- 7——结构型模式之适配器模式
- 8——结构型模式之桥接模式
- 9——结构型模式之组合模式
- 10——结构型模式之装饰者模式
- 11——结构型模式之外观模式
- 12——结构型模式之享元模式
- 13——结构型模式之代理模式
- 14——行为型模式之职责链模式
- 15——行为型模式之命令模式
- 16——行为型模式之解释器模式
- 17——行为型模式之迭代器模式
- 18——行为型模式之中介者模式
- 19——行为型模式之备忘录模式
- 20——行为型模式之观察者模式
- 21——行为型模式之状态模式
- 22——行为型模式之策略模式
- 23——行为型模式之模板方法模型
- 24——行为型模式之访问者模式
- 设计模式总结