Strategy 策略模式(行为型模式)

动机(Motivation)

在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。

如何在运行时根据需要透明地更改算法?将算法与对象本身解耦,从而避免上述问题?

意图(Intent)

定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。该模式使得算法可以独立于使用它的客户而变化。——《设计模式》GoF

示例代码

    enum CartType
{
A, B, C
}
class Cart
{
public void Process(CartType cartType)
{
if (cartType == CartType.A)
{
ProcessorA();
}
else if (cartType == CartType.B)
{
ProcessorB();
}
else if (cartType == CartType.C)
{
ProcessorC();
}
} private void ProcessorA()
{
//...
}
private void ProcessorB()
{
//...
}
private void ProcessorC()
{
//...
}
}

使用策略模式后的代码:

    public interface IProcessStrategy//表达算法抽象
{
void Process();
} public class ProcessStragegyA : IProcessStrategy
{
public void Process()
{
//...
}
}
public class ProcessStragegyB : IProcessStrategy
{
public void Process()
{
//...
}
}
public class ProcessStragegyC : IProcessStrategy
{
public void Process()
{
//...
}
} class Cart
{
private IProcessStrategy processStrategy; public Cart(IProcessStrategy processStrategy)
{
this.processStrategy = processStrategy;
} public void Somemethod1()
{
//...
processStrategy.Process();
//...
} public void Somemethod2()
{
//...
processStrategy.Process();
//...
}
}

客户端调用:

        static void Main(string[] args)
{
Cart cart=new Cart(new ProcessStragegyA());//这里可以通过配置来动态调用
cart.Somemethod1();
}

结构(Structure)

Strategy模式的几个要点

  • Strategy及其子类为组件提供了一系列的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。所谓封装算法,支持算法的变化。
  • Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。
  • 与State类似,如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省开销。

转载请注明出处:

作者:JesseLZJ
出处:http://jesselzj.cnblogs.com

最新文章

  1. 利用HTML5 的Datalist 元素实现输入提示
  2. Xcode安装插件,错误选择了Skip Bundles,重新出现Load Bundles方法
  3. JavaScript(四)——DOM操作——Window.document对象
  4. mxnet目录结构
  5. [LeetCode] TwoSum
  6. 用通俗易懂的大白话讲解Map/Reduce原理
  7. javascript - 二叉树
  8. 利用窗口引用漏洞和XSS漏洞实现浏览器劫持
  9. erl0008 - unicode 和 utf-8之间的关系
  10. 我的WCF之旅(3):在WCF中实现双工通信
  11. 网易云课堂_程序设计入门-C语言_第五周:函数_1分解质因数
  12. HTTP报文格式详解
  13. HDU 4421 ZOJ 3656 Bit Magic
  14. 学习面向对象编程OOP 第一天
  15. 关于java的自动拆装箱若干细节问题
  16. 使用摄像头或视频运行 ORB-SLAM2 SLAM14讲 第一次课后作业
  17. Leetcode 189.旋转数组 By Python
  18. C++中的初始化参数列表
  19. 【转】每天一个linux命令(58):telnet命令
  20. 自建YUM源以及相关维护

热门文章

  1. oracle 索引使用小结
  2. javscript踩过的坑 - 记录
  3. quartz报错 Couldn't retrieve job because the BLOB couldn't be deserialized: null
  4. Crawlspider的自动爬取
  5. 【Oracle】Oracle改变日志归档模式
  6. DataMatrix二维条码源码分析检测识别图像位置
  7. leetcode558
  8. Shiro学习之路 -- 架构及其组件
  9. javax.persistence.TransactionRequiredException: No transactional EntityManager available
  10. AngularJS与服务器交互(4)