设计模式之行为类模式PK
行为类模式包括:
- 责任链模式
- 命令模式
- 解释器模式
- 迭代器模式
- 中介者模式
- 备忘录模式
- 观察者模式
- 状态模式
- 策略模式
- 模板方法模式
- 访问者模式
行为型模式涉及到算法和对象间职责的分配
行为类模式关注如何管理对象的行为.
命令模式VS策略模式
策略模式和命令模式相似, 特别是命令模式退化时,比如无接收者(接收者非常简单或者接收者是Java的基础操作,无需专门写一个接收者), 这种情况下, 命令模式和策略模式的类图完全一样. 但是两者还是有区别的:
- 关注点不同. 策略模式关注的是算法替换的问题, 关注的是算法的完整性、封装性, 只有具备了这两个条件才能保证其可以自由更换
- 角色功能不同. 策略模式中的具体算法是负责一个 完整算法逻辑,它是不可再分的原子业务单元,一旦变更就是对算法整体的变更.而命令模式关注命令的实现, 也就是功能的实现, 命令模式中的接收者只要符合六大设计原则,完全不用关心它是否完成了一个具体逻辑,它的影响范围也 仅仅是抽象命令和具体命令, 对他的修改不会扩散到模式外的模块
- 使用场景不用. 策略模式适用于算法要求变换的场景, 而命令模式适用于解耦两个有紧耦合关系的对象场合或者多命令多撤销的场景
策略模式VS状态模式
策略模式和状态模式都是通过一个 Context 类封装一个具体的行为, 都提供了一个封装的方法,是高扩展性的设计模式. 但是, 策略模式封装的是不同的算法,而状态模式封装的是不同的状态. 两种模式虽然都有变换的行为, 但是两者的目标缺不同. 策略模式与状态模式不同点如下:
- 环境角色的职责不同. 两者都有一个Context 环境角色的类. 策略模式的环境角色只是一个委托作用,负责算法的替换; 而状态模式的环境角色不仅仅是委托行为,它还具有登记状态变化的功能,与具体的状态类协作,共同完成状态切换行为随之切换的任务
- 解决问题的重点不同. 策略模式旨在解决内部算法如何改变的问题, 也就是将内部算法的改变对外界的影响降低到最小; 而状态模式旨在解决内在状态的改变而引起行为改变的问题, 它的 出发点是事物的状态,封装状态 而暴露行为,一个 对象的状态改变,从外界来看就好像是行为改变.
- 解决问题的方法不同. 策略模式只是确保算法可以自由切换,但是什么时候用什么算法它决定不了; 而状态模式对外暴露的是行为,状态的变化一般是由环境角色和具体状态共同完成的, 也就是说状态模式封装了状态的变化而暴露了不同的行为或行为结果
- 应用场景不同. 策略模式的算法必须是平行的,否则就封装了一堆垃圾. 状态模式则要求有一系列状态发生变化的场景, 它要求有状态且有行为的场景.
- 复杂度不同. 通常策略模式比较简单, 这里简单是指结构简单,扩展比较容易,而且代码也容易阅读. 而状态模式通常比较复杂,因为它要从两个角色看到一个对象状态和行为的改变,也就是说它封装的是变化,而变化是无穷的, 因此相对来说状态模式通常都比较复杂, 涉及面很多,虽然也很容易扩展,但是一般不会进行大规模的扩张和修正
观察者模式VS责任链模式
这两个模式好像没有太多的相似性啊. 我们在观察者模式中, 一个具体的角色既可以是观察者, 也可以是被观察者, 这样就形成了一个观察者链.这与责任链模式非常相似, 都实现了事务的链条化处理. 但是他们还是有区别的, 区别如下:
- 链中的消息对象不同. 责任链模式基本上不改变消息对象的结构, 虽然每个节点都可以参与消费,但是它的结构不会改变, 比如从首节点传递进来一个String对象, 不会到链尾的时候成了int对象,这在责任链模式中式不可能的, 但是在观察者链中是允许的,链中传递的对象可以自由变化,只要上下级节点对传递对象了解即可,它不要求链中的消息对象不变化,只要求链中相邻两个节点的消息对象固定
- 上下节点的关系不同. 在责任链中, 上下节点没有关系, 都是接受同样的对象,所有传递的对象都是从链首传递过来,,上一节点是什么没有关系,只要按照自己的逻辑处理就成. 而观察者链就不同了, 它的上下级关系很亲密,下级对上级顶礼膜拜,上级对下级绝对信任,链中的任意两个相邻节点 都是一个牢固的独立团体
- 消息的分销渠道不同. 在责任链中,一个消息从链首传递进来后,就开始沿着链条想链尾运动, 方向是单一的,固定的; 而观察者链则不同, 由于它采用的是观察者模式,所以有非常大的灵活性,一个消息传递到链首后,具体怎么传递时不固定的,可以以广播方式传递,也可以以跳跃方式传递,这取决于处理消息的逻辑.
设计模式之行为类模式PK的更多相关文章
- 设计模式之创建类模式PK
创建类模式包括: 工厂方法模式 建造者模式 抽象工厂模式 单例模式 原型模式 创建类模式能够提供对象的创建和管理职责. 其中单例模式和原型模式非常容易理解, 单例模式是要保持在内存中只有一个对象,原型 ...
- 设计模式之结构类模式PK
结构类模式包括: 适配器模式 桥梁模式 组合模式 装饰模式 门面模式 享元模式 代理模式 结构类模式着重于如何建立一个软件结构 为什么叫结构类模式呢? 因为他们都是通过组合类或对象产生更大结构以适应更 ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
- 设计模式之结构类模式大PK
结构类模式大PK 结构类模式包括适配器模式.桥梁模式.组合模式.装饰模式.门面模式.享元模式和代理模式.之所以称其为结构类模式,是因 ...
- 设计模式之创建类模式大PK
创建类模式大PK 创建类模式包括工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,他们能够提供对象的创建和管理职责.其 ...
- ZT 创建类模式总结篇
创建类模式总结篇 分类: 设计模式 2012-03-26 09:03 7320人阅读 评论(11) 收藏 举报 编程优化设计模式任务 创建类模式主要关注对象的创建过程,将对象的创建过程进行封装,使客户 ...
- 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)
设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...
- 【设计模式】 模式PK:工厂模式VS建造者模式
1.概述 工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步地精确构造创建出一个复杂的对象.我们举个简单例子来说明两者的差异,如要制造一个超人,如果使用工厂方 ...
- 【设计模式】 模式PK:包装模式群PK
1.概述 我们讲了这么多的设计模式,大家有没有发觉在很多的模式中有些角色是不干活的?它们只是充当黔首作用,你有问题,找我,但我不处理,我让其他人处理.最典型的就是代理模式了,代理角色接收请求然后传递到 ...
随机推荐
- 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事
微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...
- springboot中logback打印日志
http://blog.csdn.net/fan510988896/article/details/54409790
- Scrapy 1.4 文档 04 例子
最好的学习方法是举例说明,Scrapy也不例外. 因此,我们有一个名为 quotesbot 的 Scrapy 项目,您可以通过它来学习更多关于 Scrapy 的知识. 它包含两个用于http://qu ...
- django从0到1搭建网站
曾经有人说我前端很水,那么在这一系列文章中我打算把前后端融合在一起来做一次网站的全面重构,希望可以把刚刚入行的同学带上正途 请尊重原创,转载请注明来源网站www.shareditor.com以及原 ...
- knockout + easyui = koeasyui
在做后台管理系统的同学们,是否有用easyui的经历.虽然现在都是vue.ng.react的时代.但easyui(也就是jquery为基础)还是占有一席之地的.因为他对后端开发者太友好了,太熟悉不过了 ...
- Dubbo源码-Dubbo是如何随心所欲自定义XML标签的
叨叨 今天考虑了很久要不要写这篇文章. 距离<Dubbo源码>系列的开篇到现在已经快两个月时间了.当时是想着工作上的RPC框架使用存在一些让人头疼的问题,就来看看Dubbo给出了一套什么样 ...
- 区分IE8 、IE9 、IE10的专属css hack
想让IE8及以下的浏览器实现同样的效果,且不希望使用css3pie或htc或条件注释等方法时,可能就会需要用到IE8和IE9的专属css hack了. .test{ /* 1. */ color:#0 ...
- scrapy分布式爬虫scrapy_redis二篇
=============================================================== Scrapy-Redis分布式爬虫框架 ================ ...
- Maven常识
maven下面通常有四个文件夹: src/main/java -- 用来存放业务代码 src/test/java -- 用来存放测试代码 另有两个名为resource的文件夹,通常用来放置前两个文件夹 ...
- sql server 内存初探
一. 前言 对于sql server 这个产品来说,内存这块是最重要的一个资源, 当我们新建一个会话,相同的sql语句查询第二次查询时间往往会比第一次快,特别是在sql统计或大量查询数据输出时,会有这 ...