策略模式(strategy pattern)

定义>>

将一系列的算法封装到一些列的类里面,并且可以相互替换

作用>>

将算法的变化独立于客户端,将算法的指责和算法的行为分开,将算法的使用和具体的算法流程区分开

组成>>

策略类:封装了一个算法实现;一般只暴漏一个方法供其它地方调用,比如排序,查找,计算折扣等等
抽象策略类:既然一种算法代表一个策略类,那么多种算法就需要定义多个策略类,这些策略类的共性是只暴漏了一个方法,而且算法的职责是相似的,算法的步骤可能是大不相同的。这个时候就可以定义一个抽象的策略类(可以是抽象类,也可以是个接口),来包装各个策略类,而这些策略类也需要继承/抽象定义好的抽象策略类 。

图例>>

优缺点>>

优点:对“开闭原则”的完美支持,在不修改原有系统的基础上更换算法或者增加新的算法,避免多重条件转移语句的实现方式;
缺点:客户端必须知道所有的策略类,并理解其区别;一定程度上增加了系统中类的个数,可能存在多个策略类

实例>>

例子:

  1. 书城要打折,不同种类的书都有不同的折扣。怎么设计返回书价的接口?
  2. 比较策略:比如要比一个人牛逼不牛逼,可以通过能力,颜值,财富等等各个方面;每个方面都可以生成一个比较器;AblityComparator impements Comparator; Collections是环境角色;
  3. 排序策略:比如自己实现一个排序器,作为一个排序策略的抽象接口;然后由实现类充当各个排序策略(与比较策略比较相似,可以进行联想记忆)
  4. ThreadPoolExecutor中的四个拒绝策略;抽象接口是RejectedExecutionHandler, 四个实现策略:ThreadPoolExecutor.AbortPolicy, ThreadPoolExecutor.DiscardPolicy, ThreadPoolExecutor.DiscardOldestPolicy, ThreadPoolExecutor.CallerRunsPolicy;ThreadPoolExecutor是环境角色

最新文章

  1. 流程控制和循环.png
  2. Aspose.Cells 导出 excel
  3. 初学js
  4. 利用CSS预处理技术实现项目换肤功能(less css + asp.net mvc4.0 bundle)
  5. Spring day04笔记(SVN讲解和回顾昨天知识)
  6. Android各个版本 版本号对应关系表
  7. 让你的PHP程序真正的实现多线程(PHP多线程类)(转)
  8. C++ STL map
  9. VCS仿真生成fsdb文件(Verilog)
  10. UVA11090 Going in Cycle!! (二分+SPFA推断有无负权)
  11. Android4.0 Design之UI设计缺陷1
  12. java synchronized内置锁的可重入性和分析总结
  13. 针对Mac的DuckHunter攻击演示
  14. 【SqlServer】SqlServer中的计算列
  15. 5.0-uC/OS-III时间管理
  16. Python函数学习
  17. IO多路复用 IO异步
  18. spring(读取外部数据库配置信息、基于注解管理bean、DI)
  19. 网络对抗——web基础
  20. java添加templates模板,httpServlet模板改写

热门文章

  1. PHP 中提示undefined index如何解决(多种方法)
  2. JavaScript停止事件冒泡和取消事件默认行为
  3. SQL查询语句执行的逻辑顺序
  4. css 笔记1
  5. JSON与对象的序列化与反序列化
  6. [TOP10]最受欢迎的10个Metasploit模块和插件
  7. 021.12 IO流 ObjectStream对象序列化
  8. CString char BSTR 转换
  9. iOS UI(绘图)的几张原理图
  10. [转]CentOS 7忘记root密码解决办法