Skip to content

Files

Latest commit

d455ae4 · Aug 20, 2018

History

History

pkbehavior

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Jan 5, 2015
Jan 5, 2015
Jan 5, 2015
Aug 20, 2018

行为类模式大PK


1.命令模式VS策略模式

       策略模式的意图是封装算法,它认为算法已经是一个完整的、不可拆分的原子业务(注意这里是原子业务,而不是原子对象),即其意图是让这些算法独立,并且可以相互替换,让行为的变化独立于拥有行为的客户;而命令模式则是对动作的解耦,把一个动作的执行分为执行对象(接收者角色)、执行行为(命令角色),让两者相互独立而不相互影响。

1.1最佳实践

       命令模式和策略模式的类图完全一样,代码实现也比较类似,但是两者还是有区别的。

  • 关注点不同
           策略模式关注的是算法的完整性、封装性,只有具备了这两个条件才能保证其可以自由切换。命令模式则关注的是解耦问题。
  • 角色功能不同
           策略模式中的抽象算法和具体算法与命令模式的接收者非常相似,但是他们的职责不同。策略模式中的具体算法是负责一个完整算法逻辑,它是不可再拆分的原子业务单元,一旦变更就是对算法整体的变更。而命令模式关注的是功能的实现。
  • 使用场景不同
           策略模式使用于算法要求变换的场景,而命令模式适用于解耦两个有紧耦合关系的对象场合或者多命令多撤销的场景。

2.状态模式VS策略模式

       策略模式封装的是不同的算法,算法之间没有交互、以达到算法可以自由切换的目的;而状态模式封装的是不同的状态,以达到状态切换行为随之发生改变的目的。这两个模式虽然都有变换的行为,但是两者的目标却是不同的。

2.1最佳实践

  • 环境角色的职责不同
           两者都有一个叫做Context环境角色的类, 策略模式的环境角色只是一个委托作用,负责算法的替换;而状态模式的环境角色不仅仅是委托行为,它还具有登记状态变化的功能,与具体的状态类协作,共同完成状态切换的任务。
  • 解决问题的重点不同
           策略模式旨在解决内部算法如何改变的问题,也就是将内部算法的改变对外界的影响降低到最小程度,它保证算法可以自由切换;而状态模式旨在解决内在状态的改变而引起行为改变的问题,它的出发点是事物的状态,封装状态而暴露行为,一个对象的状态改变,从外界看就好像是行为改变。
  • 解决问题的方法不同
           策略模式只是确保算法可以自由切换,但是什么时候用什么算法它决定不了;而状态模式对外暴露的是行为,状态的变化一般由环境角色和具体状态共同完成的,也就是说状态模式封装了状态的变化而暴露了不同的行为或行为结果。
  • 应用场景不同
           策略模式是一系列平行的、可相互替换的算法封装后的结构。状态模式则要求有一系列状态发生变化的场景,它要求的是有状态且有行为的场景,也就是一个对象必须具有二维描述才能采用状态模式,如果只有状态而没有行为,则状态的变化就失去了意义。
  • 复杂度不同
           通常策略模式结构简单,扩展比较容易,而且代码也容易阅读。而状态模式通常比较复杂,因为它要从两个角色看到一个对象状态和行为的改变,也就是说它封装的是变化,要知道变化是无穷尽的,因此相对来说状态模式通常都比较复杂,涉及面很多,虽然也很容易扩展,但是一般不会进行大规模的扩展和修正。

3.观察者模式VS责任链模式

       因为观察者模式也提到了触发链的问题,所以把这两个模式放到一起对比。

3.1最佳实践

  • 链中消息对象不同
           从首节点开始到最终的尾节点,两个链中传递的消息对象是不同的。责任链模式基本上不改变消息对象的结构,但是在触发链传递的对象可以自由变化,只要上下级节点对传递对象了解即可。
  • 上下节点的关系不同
           在责任链中,上下节点没有关系,都是接收同样的对象。而触发链模式的上下级关系很亲密,链中的任意两个相邻节点都是一个牢固的独立团体。
  • 消息的分销渠道不同
           在责任链模式中,一个消息从链首传递进来后,就开始沿着链条向链尾运动,方向是单一的,固定的;而触发链模式则不同,由于它采用的是观察者模式,所以有非常大的灵活性,一个消息传递到链首后,具体怎么传递是不固定的,可以以广播方式传递,也可以以跳跃方式传递,这取决于处理消息的逻辑。