`
fansfirst2008
  • 浏览: 95447 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

策略模式--读chjavach之博客感想

阅读更多

    首先申明,此处将大量引用chjavach之博客,因为他写得太好了,太精准了!而且此博客的目的也只是相当于读书笔记而已.只是对自己的理解和记忆有用罢了!

   策略模式可谓最简单的模式,其类图只要瓢一眼,保准你十年忘不掉!然而要灵活多变,掌握其精髓,如果没有深刻的认识,是难以做到的!

为了理解而理解

 

模式只是类结构,或者基于类的算法,不是基于数据结构的算法

chjavach 写道
(1)策略模式的功能
策略模式的功能是把具体的算法实现,从具体的业务处理里面独立出来,把它们实现成为单独的算法类,从而形成一系列的算法,并让这些算法可以相互替换。
策略模式的重心不是如何来实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活、具有更好的维护性和扩展性。

 

与if-else相似,并且可以替代.重构之一就是if-else了,但是一个过程式思维和一个面向对象思维,之间的转换,是挑战哈

chjavach 写道
2)策略模式和if-else语句
看了前面的示例,很多朋友会发现,每个策略算法具体实现的功能,就是原来在if-else结构中的具体实现。
没错,其实多个if-elseif语句表达的就是一个平等的功能结构,你要么执行if,要不你就执行else,或者是elseif,这个时候,if块里面的实现和else块里面的实现从运行地位上来讲就是平等的。
而策略模式就是把各个平等的具体实现封装到单独的策略实现类了,然后通过上下文来与具体的策略类进行交互。
因此多个if-else语句可以考虑使用策略模式。

 如图,策略A与策略B或者C,之间的关系,用下面的话来解释,真的是太精准了

chjavach写道
3)算法的平等性
策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正是因为这个平等性,才能实现算法之间可以相互替换。
所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。
所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。

转换角色,转换思考角度去观察模式,以策略模式的客户去认识策略模式,在类图的表现上,实际就是context的设计,或者如何使用策略的文档

 

chjavach 写道
(4)谁来选择具体的策略算法
在策略模式中,可以在两个地方来进行具体策略的选择。
一个是在客户端,在使用上下文的时候,由客户端来选择具体的策略算法,然后把这个策略算法设置给上下文。前面的示例就是这种情况。
还有一个是客户端不管,由上下文来选择具体的策略算法,这个在后面讲容错恢复的时候给大家演示一下。

 具体的策略分析了,客户分析了,那怎么架起这座桥梁呢?那当然是接口和抽象类了!

chjavach 写道
在前面的示例中,Strategy都是使用的接口来定义的,这也是常见的实现方式。但是如果多个算法具有公共功能的话,可以把Strategy实现成为抽象类,然后把多个算法的公共功能实现到Strategy里面。



 关注了静态结构,那么运行时刻的特点,是下面这样的

chjavach 写道
(6)运行时策略的唯一性
运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态的在不同的策略实现中切换,但是同时只能使用一个。

 再从对修改封闭,对扩展开放,这个软件原则来分析下

chjavach 写道
7)增加新的策略
在前面的示例里面,体会到了策略模式中切换算法的方便,但是增加一个新的算法会怎样呢?比如现在要实现如下的功能:对于公司的“战略合作客户”,统一8折。
其实很简单,策略模式可以让你很灵活的扩展新的算法。具体的做法是:先写一个策略算法类来实现新的要求,然后在客户端使用的时候指定使用新的策略算法类就可以了。

 

其实在chjavach博客中,涵盖了所有这一起的,我现在只不过想来个看图连线!

 

为了实践的模式

  chjavach 博客中有两个事例,非常好理解,也具有非常好的参考价值,一是报价系统,对于报价这个多种策略行文的封装,二是对于容错处理,这个非常新鲜,主要是我经验太少的缘故,所以见笑了!

   但是我觉得,对于自己这个学习者是,远远不够的!

   之前也看过很多设计模式的书,当然只是纸上谈兵.但是在实践中,我却甚是苦恼.对于很多,我认为可以使用设计模式的地方却是无所适从,眼高手低!

  曾特别的关注重构趋于模式,所以那时候也强烈的感受到,模式的使用,是慢慢的重构出来的!

  博客写至此,突然想到,是不是背后的思维方式在作怪呢?

  如果脑子力就是过程式,那么用设计模式就是不可能的!而重构,可以让我从过程慢慢的转变到面向对象思维中,慢慢的清晰与可理解!

  那么为什么不以开始就以面向对象的思维方式呢?是不是平时整日浸淫在过程或者别的思维方式之中,对于面向对象的转换并不是那么的容易呢?


  之前也一度想过,可能是对于背后的设计原则并没有深刻的理解吧?单职责原则,对于职责的划分,在实践和工作中,怎么慢慢的分析与得到呢?其实工作中,哪里还会这么的细细的想啊?或者以功能为导向的工作,扼杀了设计原则,设计模式的应用!

 

 总结下

  理解策略模式并不难,只要稍要基础的人,都可以做到!

  然而要应用它,最难的还是克服习惯性的过程式思维,以面向对象的角度思考,并且以设计原则为根本去分析问题,设计解决方案

  当然,多欣赏优秀代码,并且触类旁通,然后深刻对比与反思,也是可以达到应用好设计模式的! 

 

分享到:
评论
1 楼 ashidaya 2012-09-07  
陈臣的博客

相关推荐

Global site tag (gtag.js) - Google Analytics