"策略模式是对算法的包装,是把使用算法的责任和算法本身分割开,委派给不同的对象管理......"(<java与模式>),其简单示意类图如下:
文中提到,策略模式仅仅是封装算法,至于客户端具体要使用哪个具体策略类,则由客户端去判断。
    个人十分不理解这种做法,既然要客户端知道所有的具体策略类,并且去判断使用谁,那何必对具体策略类进行抽象呢?进行抽象后,客户端可能会如下使用各种策略:


IStrategy someStrategy = new ConcreteStrategy1();
someStrategy.doSomething(); //运行策略
IStrategy otherStrategy = new ConcreteStrategy2();
otherStrategy .doSomething(); //运行策略

我实在看不到强大的“抽象”工具在这里提供的好处,如果不进行抽象同样可以通过:ConcreteStrategy1 someStrategy = new ConcreteStrategy1();来进行具体策略的使用。难道说这个抽象仅仅是为了规范接口而已?
    具体例子:在<java与模式>中,举了使用Strategy模式的一个例子--图书折扣的计算,在这个例子中,客户端要对图书进行判断,属于哪类折扣书籍,然后再实例化具体的策略类进行调用。个人认为,这并不符合设计模式中职责分离的原则,一些不应该有客户来做的事却分配到了客户对象里。我觉得,客户所应该做的仅仅是,他得到一批书籍,现在想知道这批书籍的折扣,具体哪本书怎么折扣应该交给其他对象来计算。所以,我想象中的策略模式应该在Client和IStrategy之间再加入一个策略管理对象,大概示意图如下:

这样就把判断使用哪个具体策略的职责转嫁到了StrategyManager上,当然,Client需要将某些标识传给StrategyManager以判断选择哪个具体策略类。我认为这样可以进一步简化客户端的编码,同时也利于维护和扩展。
    以上就是个人对策略模式的一点思考,如有不妥之处,还望各位指教~~

转载于:https://www.cnblogs.com/DotNetFresh/archive/2005/06/24/180278.html

Strategy模式的一点思考相关推荐

  1. 对策略模式与状态模式的一点思考

    在以前的一片博文里 http://www.cnblogs.com/mightofcode/archive/2012/11/19/2771216.html,我发表了我对设计模式的一点看法 但是今天的一个 ...

  2. 奇幻RPG(角色技能 与 Strategy模式)

    奇幻RPG(角色技能 与 Strategy模式) 引言 看过一些设计模式方面的书籍和文章,虽然很正式,很权威,(也觉得有那么一点刻板),总是觉得让人不那么好靠近.于是,我思考着像写故事一样来写下自己对 ...

  3. Strategy模式

    一.从订餐开始<?XML:NAMESPACE PREFIX = O /> 小王和小刘两人到餐厅点餐,两人分别如下告诉厨师. 小王:我要一杯加了香草冰淇淋的巧克力汽水. 小刘:一个黑与白. ...

  4. 关于STM32驱动DS1302实时时钟的一点思考

    关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...

  5. python多线程队列处理_Python线程和队列使用的一点思考

    Python线程和队列使用的一点思考 1. 斗哥采访环节请问为什么要使用线程? 答:为了提高程序速度,代码效率呀. 请问为什么要使用队列? 答:个人认为队列可以保证线程安全,实现线程间的同步,比较稳. ...

  6. 关于前端职业规划的一点思考

    自己目前已经工作3年了,最近也刚换了新工作,日常也一直在考虑自己的前端职业规划到底是怎样的,目前个人视角还不是很宽广,怕误人子弟,以下这篇文章有点启发,故转发供大家借鉴(里面有部分内容做了一些小修改) ...

  7. 关于优质博客聚合的一点思考

    前言 随着互联网时代的到来,我们发现知识的获取不再像历史上任何一个时代那么复杂,而是变得十分的简单.互联网每天都在产生巨大的信息,这些信息又多又杂,可谓是知识的海洋,太多优质的内容就这样悄无声息的被淹 ...

  8. 关于精准测试的一点思考

    精准测试是现代软件测试面临的一个重大挑战.这个挑战来源于两方面的背景. 一,软件测试资源有限.如何提高资源利用率,减少资源浪费,有针对性而不是漫无目的地进行软件测试? 二,软件测试复杂度高.如何克服各 ...

  9. 【工业互联网】关于制造业新思维和工业互联网机理的一点思考

    关于制造业新思维和工业互联网机理的一点思考(上) 来源:  工业互联网产业联盟 <深化"互联网+先进制造业"发展工业互联网的指导意见>已经国务院常务会议审议通过.工业互 ...

  10. Strategy模式和Template Method模式的异同浅析

    一.Strategy模式 1. 特点说明: 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换. 适用场景: 许多相关的类仅仅是行为有异."策略"提供了一种用多个行为中的 ...

最新文章

  1. git push origin master和git push有什么区别?
  2. Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test)
  3. 哈夫曼编码(Huffman)Java实现代码简化版
  4. 【嵌入式】Libmodbus源码分析(一)-类型和结构体
  5. Integer的==问题
  6. 在Web中如何运用JavaScript实现打印功能
  7. 什么是 TypeScript 的 Module Augmentation
  8. springCloud工作笔记090---SpringCloud_redis配置多数据源_redis多数据源
  9. Excel中如何引用 「文件名」、「sheet 页」的名字
  10. 机器人庄园作文_2018年6月四级作文热点话题预测:高端的机器人
  11. Delphi7·ProgressBar控件
  12. 【Multisim仿真】双向晶闸管功能演示
  13. MySQL高级面试题
  14. 在线HTTP POST/GET接口测试 地址
  15. 苹果手机可以微信分身吗_微信和微信分身版有区别吗
  16. 惠普台式计算机耳机插口,惠普耳机插在台式电脑上没声音,为什么
  17. 基于Robopeak触摸屏和官方摄像头的树莓派照相机
  18. php 中cookie的简介,setcookile() 的用法,如何理解cookie
  19. 什么是HTTPS证书
  20. 硬盘格式化数据恢复(图文教程)

热门文章

  1. windows 10下让jar文件双击可以运行的解决方法
  2. SP263 PERIOD - Period
  3. 百科知识 STEP文件如何打开
  4. LinkedList 注意事项
  5. Android 数字动画
  6. 《玩转D语言系列》三、轻松大跃进,把它当C语言先用起来
  7. 论文阅读:Siam-RPN
  8. Linux SendMail发送邮件失败诊断案例(四)
  9. hdu 3926 hands in hands
  10. B - Vicious Keyboard