行为类模式大PK(总结)

行为类模式包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法、访问者模式,我去,好多。。。下面主要挑选几个比较容易混淆且比较重要的模式进行对比说明。

一、命令模式VS策略模式

1、关注点不同

策略模式关注的是算法替换的问题:一个新的算法投产,旧算法退休,或者提供多种算法由调用者自己选择使用,算法的自由更替是它实现的要点。换句话说,策略模式关注的是算法的完整性、封装性,只有具备了这两个条件才能保证其可以自由切换。

命令模式则关注的是解耦问题,如何让请求者和执行者解耦是它需要首先解决的,解耦的要求就是把请求的内容封装为一个一个的命令,由接收者执行。由于封装成了命令,就同时可以对命令进行多种处理,例如摊销、记录等。

2、角色功能不同

策略模式中的具体算法是负责一个完整算法逻辑,它是不可再拆分的原子业务单元,一旦变更就是对算法整体的变更。

命令模式傲游命令的实现,也就是功能的实现。例如我们在分支中也提到接收者的变更问题,它只影响到命令族的变更,对请求者没有任何影响,从这方面来说,接收者对命令负责,而与请求者无关,命令模式中的接收者只要符合六大设计原则,完全不用关心它是否完成了一个具体逻辑,它的影响范围也仅仅是抽象命令和具体命令,对它的修改不会扩散到模式外的模块。当然,如果在命令模式中需要指定接收者,则需要考虑接收者的变化和封装。

3、使用场景不同

策略模式适用于算法要求变换的场景,而命令模式适用于解耦两个有紧耦合关系的对象场合或者多命令多撤销的场景。

二、策略模式VS状态模式

1、环境角色的职责不同

两者都有一个叫Context环境角色的类,但是两者的区别很大,策略模式的环境角色只是一个委托作用,负责算法的替换;而状态模式的环境角色不权权是委托行为,它还具体登记状态变化的功能,与具体的状态类协作,共同完成状态切换行为随之切换的任务。

2、解决问题的重点不同

策略模式旨在解决内部算法如何改变的问题,也就是将内部算法的改变对外界的影响降低到最小程序,它保证的是算法可以自由地切换;而状态模式旨在解决内在状态的改变而引起行为改变的问题,它的出发点是事物的状态,封装状态而暴露行为,一个对象的状态改变,从外界来看就好像是行为改变。

3、解决问题的方法不同

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

4、应用场景不同

策略模式只是一个算法的封装,可以是一个有意义的对象,也可以是一个无意义的逻辑片段,比如MD5加密算法。其算法必须是平行的,可以相互替换,否则策略模式就封装了一堆垃圾。状态模式则要深圳市一系列状态发生变化的场景,它要求的是有状态且有行为的场景,也就是一个对象必须具有二维(状态和行为)描述才能采用状态模式,如果只有状态而没有行为,则状态的变化就失去了意义。

5、复杂度不同

从设计模式的角度分析,通常策略模式比较简单,这里的简单指的是结构简单,扩展比较容易,而且代码也容易阅读。而状态模式则通常比较复杂,因为它要从两个角色看到一个对象状态和行为的改变,也就是说它封装的是变化,要知道变化是无穷尽的,因此相对来说状态模式通常都比较复杂,涉及面很多,虽然也很容易扩展,但是一般不会进行大规模的扩张和修正。

三、观察者模式VS责任链模式

这两个好像没什么相似的?观察者模式中一个具体的角色既可以是观察者,也可以是被观察者,这样就形成了观察者链。这与责任链模式非常类似,它们都实现了事务的链条化处理。

1、链中的消息对象不同

从首节点开始到最终的尾节点,两个链中传递的消息对象是不同的。责任链模式基本上不改变消息对象的结构,虽然每个节点都可以参与消费,但是它的结构不会改变。但是在观察者模式中是允许的,链中传递的对象可以自由变化,只要上下级节点对传递对象了解即可,它不要求链中的消息对象不可变化 ,它只要求链中相邻两个节点的消息对象固定。

2、上下节点的关系不同

在责任链模式中,上下节点没有关系,都是接收同样的对象,所有传递的对象都是链首传递过来,上一节点是什么没有关系,只要按照自己的逻辑处理就成,而观察者模式就不同了,它的上下级关系很亲密,下级对上级顶礼膜拜,上级对下级绝对信任,链中的任意两个相邻节点都是一个牢固的独立团体。

3、消息的分销渠道不同

在责任链模式中,一个消息从链首传递进来后,就开始沿着链条向链尾运动,方向是单一的、固定的;而观察者模式则不同,有非常大的灵活性,一个消息传递到链首后,具体怎么传递是不固定的,可以以广播方式传递,也可以以跳跃方式传递,这取决于处理消息的逻辑。

时间: 2024-10-17 15:24:50

行为类模式大PK(总结)的相关文章

设计模式之行为类模式大PK

                                    行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略模式.模板方法模式.访问者模式.该组设计模式众多,如下我们着重介绍一下命令模式VS策略模式.状态模式VS策略模式.观察者模式VS责任链模式. 命令模式VS策略模式 命令模式和策略模式类图很相似,只是命令模式多了一个接收者(Receiver)角色,通过确切的Command类调用Receiver类,实现

创建类模式大PK(总结)

创建类模式包括工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,它们都能够提供对象的创建和管理职责.其中的单例模式和原型模式非常容易理解,单例模式是要保持在内存中只有一个对象,原型模式是要求通过复制的方式产生一个新对象,这两个不容易混淆.下面主要分析其它三种模式. 一.工厂方法模式VS建造者模式 1.意图不同 在工厂方法模式里,关注的是一个产品整体,无须关心产品的各部分是如何创建出来的:但在建造者模式中,一个具体产品的产生是依赖各个部件的产生以及装配顺序,它关注的是"由零件一步一步地组

创建类模式大PK

创建类模式包括工厂方法模式. 建造者模式. 抽象工厂模式. 单例模式和原型模式, 它们都能够提供对象的创建和管理职责. 其中的单例模式和原型模式非常容易理解, 单例模式是要保持在内存中只有一个对象, 原型模式是要求通过复制的方式产生一个新的对象, 这两个不容易混淆. 剩下的就是工厂方法模式. 抽象工厂模式和建造者模式了, 这三个之间有较多的相似性.30.1 工厂方法模式VS建造者模式工厂方法模式注重的是整体对象的创建方法, 而建造者模式注重的是部件构建的过程,旨在通过一步一步地精确构造创建出一个

第26章 创建型模式大PK

26.1 工厂方法模式 VS 建造者模式 26.1.1 按工厂方法建造超人 (1)产品:两类超人,成年超人和未成年超人. (2)工厂:这里选择简单工厂 [编程实验]工厂方法建造超人 //创建型模式大PK——工厂方法和建造者模式 //实例:利用简单工厂创建的超人 #include <iostream> using namespace std; //***************************抽象产品接口********************* //超人接口 class ISuperM

第28章 行为型模式大PK

27.1 策略模式 VS 命令模式 27.1.1 策略模式实现压缩算法 //行为型模式大PK——策略模式和命令模式 //实例:用策略模式实现压缩算法 #include <iostream> #include <string> using namespace std; //抽象压缩算法 class Algorithm { public: //压缩算法 virtual bool compress(string source, string to) = 0; //解压算法 virtual

第27章 结构型模式大PK

27.1 代理模式 VS 装饰模式 27.1.1 代理模式 (1)场景:客人找运动员代理要求安排运动员参加比赛 (2)说明:代理人有控制权,可以拒绝客人的要求,也可以答应安排,甚至自己下去跑(因为有些运动员本身就作自己的代理) [编程实验]找代理安排运动员比赛 //创建型模式大PK——代理模式和装饰模式 //实例:找代理安排运动员比赛 #include <iostream> #include <ctime> using namespace std; //抽象运动员 class IR

设计模式之创建类模式PK

创建类模式包括: 工厂方法模式 建造者模式 抽象工厂模式 单例模式 原型模式 创建类模式能够提供对象的创建和管理职责. 其中单例模式和原型模式非常容易理解, 单例模式是要保持在内存中只有一个对象,原型模式是要求通过复制的方式产生一个新的对象,这两个不容易混淆. 工厂方法模式VS建造者模式 工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步的精确构造创建出一个复杂的对象. 工厂方法模式和建造者模式的区别: 意图不同. 在工厂方法模式中, 我们关注的是产品的

设计模式之行为类模式PK

行为类模式包括: 责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板方法模式 访问者模式 行为型模式涉及到算法和对象间职责的分配 行为类模式关注如何管理对象的行为. 命令模式VS策略模式 策略模式和命令模式相似, 特别是命令模式退化时,比如无接收者(接收者非常简单或者接收者是Java的基础操作,无需专门写一个接收者), 这种情况下, 命令模式和策略模式的类图完全一样. 但是两者还是有区别的: 关注点不同. 策略模式关注的是算法替换的问题,

第29章 跨战区大PK

29.1 策略模式 VS 桥梁模式 29.1.1 策略模式 [编程实验]用策略模式实现邮件发送 (1)有文本和超文本两种格式的邮件,将这两种格式封装成两种不同的发送策略. (2)文本邮件和超文本邮件分别是两种不同格式的邮件的封装.MailServer是一个环境角色,它接收一个MailTemplate对象,并通过sentMail方法将邮件发送出去. //跨战区大PK——策略模式和桥接模式 //实例:用策略模式实现邮件发送 #include <iostream> #include <stri