行为类模式包括:

  1. 责任链模式
  2. 命令模式
  3. 解释器模式
  4. 迭代器模式
  5. 中介者模式
  6. 备忘录模式
  7. 观察者模式
  8. 状态模式
  9. 策略模式
  10. 模板方法模式
  11. 访问者模式

行为型模式涉及到算法和对象间职责的分配

行为类模式关注如何管理对象的行为.

命令模式VS策略模式

策略模式和命令模式相似, 特别是命令模式退化时,比如无接收者(接收者非常简单或者接收者是Java的基础操作,无需专门写一个接收者), 这种情况下, 命令模式和策略模式的类图完全一样. 但是两者还是有区别的:

  1. 关注点不同. 策略模式关注的是算法替换的问题, 关注的是算法的完整性、封装性, 只有具备了这两个条件才能保证其可以自由更换
  2. 角色功能不同. 策略模式中的具体算法是负责一个 完整算法逻辑,它是不可再分的原子业务单元,一旦变更就是对算法整体的变更.而命令模式关注命令的实现, 也就是功能的实现, 命令模式中的接收者只要符合六大设计原则,完全不用关心它是否完成了一个具体逻辑,它的影响范围也 仅仅是抽象命令和具体命令, 对他的修改不会扩散到模式外的模块
  3. 使用场景不用. 策略模式适用于算法要求变换的场景, 而命令模式适用于解耦两个有紧耦合关系的对象场合或者多命令多撤销的场景

策略模式VS状态模式

策略模式和状态模式都是通过一个 Context 类封装一个具体的行为, 都提供了一个封装的方法,是高扩展性的设计模式. 但是, 策略模式封装的是不同的算法,而状态模式封装的是不同的状态. 两种模式虽然都有变换的行为, 但是两者的目标缺不同. 策略模式与状态模式不同点如下:

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

观察者模式VS责任链模式

这两个模式好像没有太多的相似性啊. 我们在观察者模式中, 一个具体的角色既可以是观察者, 也可以是被观察者, 这样就形成了一个观察者链.这与责任链模式非常相似, 都实现了事务的链条化处理. 但是他们还是有区别的, 区别如下:

  1. 链中的消息对象不同. 责任链模式基本上不改变消息对象的结构, 虽然每个节点都可以参与消费,但是它的结构不会改变, 比如从首节点传递进来一个String对象, 不会到链尾的时候成了int对象,这在责任链模式中式不可能的, 但是在观察者链中是允许的,链中传递的对象可以自由变化,只要上下级节点对传递对象了解即可,它不要求链中的消息对象不变化,只要求链中相邻两个节点的消息对象固定
  2. 上下节点的关系不同. 在责任链中, 上下节点没有关系, 都是接受同样的对象,所有传递的对象都是从链首传递过来,,上一节点是什么没有关系,只要按照自己的逻辑处理就成. 而观察者链就不同了, 它的上下级关系很亲密,下级对上级顶礼膜拜,上级对下级绝对信任,链中的任意两个相邻节点 都是一个牢固的独立团体
  3. 消息的分销渠道不同. 在责任链中,一个消息从链首传递进来后,就开始沿着链条想链尾运动, 方向是单一的,固定的; 而观察者链则不同, 由于它采用的是观察者模式,所以有非常大的灵活性,一个消息传递到链首后,具体怎么传递时不固定的,可以以广播方式传递,也可以以跳跃方式传递,这取决于处理消息的逻辑.

设计模式之行为类模式PK的更多相关文章

  1. 设计模式之创建类模式PK

    创建类模式包括: 工厂方法模式 建造者模式 抽象工厂模式 单例模式 原型模式 创建类模式能够提供对象的创建和管理职责. 其中单例模式和原型模式非常容易理解, 单例模式是要保持在内存中只有一个对象,原型 ...

  2. 设计模式之结构类模式PK

    结构类模式包括: 适配器模式 桥梁模式 组合模式 装饰模式 门面模式 享元模式 代理模式 结构类模式着重于如何建立一个软件结构 为什么叫结构类模式呢? 因为他们都是通过组合类或对象产生更大结构以适应更 ...

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

                                        行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...

  4. 设计模式之结构类模式大PK

                                      结构类模式大PK 结构类模式包括适配器模式.桥梁模式.组合模式.装饰模式.门面模式.享元模式和代理模式.之所以称其为结构类模式,是因 ...

  5. 设计模式之创建类模式大PK

                                        创建类模式大PK 创建类模式包括工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,他们能够提供对象的创建和管理职责.其 ...

  6. ZT 创建类模式总结篇

    创建类模式总结篇 分类: 设计模式 2012-03-26 09:03 7320人阅读 评论(11) 收藏 举报 编程优化设计模式任务 创建类模式主要关注对象的创建过程,将对象的创建过程进行封装,使客户 ...

  7. 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

      设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...

  8. 【设计模式】 模式PK:工厂模式VS建造者模式

    1.概述 工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步地精确构造创建出一个复杂的对象.我们举个简单例子来说明两者的差异,如要制造一个超人,如果使用工厂方 ...

  9. 【设计模式】 模式PK:包装模式群PK

    1.概述 我们讲了这么多的设计模式,大家有没有发觉在很多的模式中有些角色是不干活的?它们只是充当黔首作用,你有问题,找我,但我不处理,我让其他人处理.最典型的就是代理模式了,代理角色接收请求然后传递到 ...

随机推荐

  1. CentOS 6 安装Hadoop集群

    hadoop2.6.4安装包(链接:https://pan.baidu.com/s/15qHpdoLBQHP4HdxOJzNcsg 密码:5hel) 1.准备Linux环境 1.0先将虚拟机的网络模式 ...

  2. CSS中的背景、雪碧图、超链接的伪类样式

    一.背景 1.背景颜色 background-color: red; 2.背景图片 background-image: url("../../img/l1.png"); 3.图片填 ...

  3. Python_socket_TCP

    zServer.py # coding=utf-8 import socket words={'how are you?':'Fine,thank you.', ', 'what is your na ...

  4. react 高阶组件的 理解和应用

    高阶组件是什么东西 简单的理解是:一个包装了另一个基础组件的组件.(相对高阶组件来说,我习惯把被包装的组件称为基础组件) 注意:这里说的是包装,可以理解成包裹和组装: 具体的是高阶组件的两种形式吧: ...

  5. java.util.BitSet 详细分析 学习笔记

    1,BitSet类    大小可动态改变, 取值为true或false的位集合.用于表示一组布尔标志.   此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的 ...

  6. 好代码是管出来的——使用Git来管理源代码

    软件开发过程中一个重要的产出就是代码,软件的编码过程一般是由一个团队共同完成,它是一个并行活动,为了保证代码在多人开发中能够顺利完成,我们需要使用代码版本控制工具来对代码进行统一存储,并追踪每一份代码 ...

  7. 过滤emoji表情符

    1.使用正则匹配 public  function remove_emoji($text){        return preg_replace('/([0-9|#][\x{20E3}])|[\x{ ...

  8. 如何查找Linux服务器上JDK安装路径?

    成功远程到你要部署软件的Linux服务器上.这是第一步. 查看JDK版本:java -version 查看java执行路径:which java 查看JAVA_HOME路径:echo $JAVA_HO ...

  9. 高性能Server---Reactor模型【转载】

    原文链接:http://www.ivaneye.com/2016/07/23/iomodel.html 无处不在的C/S架构 在这个充斥着云的时代,我们使用的软件可以说99%都是C/S架构的! 你发邮 ...

  10. postgres 数据库的安装

    环境:Linux version 2.6.32-642.el6.x86_64   软件版本:postgresql-9.6.8.tar.gz 新项目要上线测试,要求安装一个PG 的数据库 我们进行的是源 ...