行为类模式大PK

时间:2021-08-01 18:58:09

      行为类模式包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式

1、命令模式VS策略模式

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

    举例来说明:zip与gzip压缩,先来看看用策略模式实现压缩算法,UML图如下:

行为类模式大PK      命令模式实现压缩算法,命令模式的主旨是封装命令,是请求者与实现者解耦,在命令模式中,就是在抽象命令中定义了接受者的引用,然后在具体的实现类中确定要让那个接收者处理,UML图如下所示:行为类模式大PK     两者区别:

      1、关注点不同:策略模式关注的是算法替换的问题,而命令模式则关注的是解耦问题,如何让请求者和执行者解耦是它需要首先解决。

      2、角色功能不同:策略模式的具体算法是负责一个完整算法逻辑,它是不可再拆分的原子业务单元,而命令模式则不同,关注命令的实现,也就是功能的实现,

      3、使用场景不同:策略模式适用于算法要求变换的场景,而命令模式适用于解耦两个有紧耦合关系的对象场合或多命令多撤销的场景,如餐馆吃饭点餐,由厨师做饭,采用命令模式更好,首先客户点菜可以由任何厨师去做,而且还可以撤销

2、策略模式VS状态模式

      两者的类图非常的相似,但是两者区别很大,策略模式封装的是不同的算法,算法之间没有交互,以达到算法可以*切换的目的;状态模式封装的是不同的状态,以达到状态切换行为随之发生改变的目的,下面举例子来说明这两个模式的区别,先来看看策略模式来实现人生的UML图:

行为类模式大PK      下面来看看状态模式实现人生,UML图如下所示:

行为类模式大PK      两者的异同点:

      1、环境角色的职责不同:策略模式的环境角色只是一个委托作用,负责算法的替换,而状态模式的环境角色不仅仅是委托作用,它还具有登记状态变化的功能,与具体的状态类写作,共同完成状态切换行为随之切换的任务

      2、解决问题的重点不同:策略模式旨在解决内部算法如何改变的问题,也就是将内部算法的改变对外面的影响降低到最小程度,而状态模式旨在解决内在状态的改变而引起行为变化的问题,它的出发点是事物的状态, 封装状态而暴露行为,一个对象的状态改变,从外界来看好像是行为改变

      3、解决问题的方法不同:策略模式只是确保算法可以*切换,但是什么时候用什么算法它决定不了,而状态模式对外暴露的是行为,状态的变化一般是由环境角色和具体状态共同来完成的,也就是说状态模式封装了状态的变化而暴露了不同的行为或行为结果

      4、应用场景不同:策略模式运用的时候,算法必须是平行的,可替换的,状态模式要求有一系列状态发生变化的场景,它要求的是有状态且有行为的场景

      5、复杂度不同:策略模式简单,状态模式通常较复杂

3、观察着模式VS责任链模式

     用责任链模式实现DNS解析过程:行为类模式大PK

      在观察着模式中也存在着触发链的问题,一个具体的角色既可以是观察着,也可以是被观察者,这样就形成了一个观察者链,来看看这个模式如何来实现,UML图如下:

行为类模式大PK       触发链与责任链区别:

         1、链中的消息对象不同:责任链模式中消息传递的对象结构不会改变,而触发链模式是可变的

         2、上下节点的关系不同:责任链模式上下节点没有关系,而触发链模式上下节点关系很亲密

         3、消息的分销渠道不同:责任链模式传递是单一的,固定的,而触发链模式是不固定的