设计模式之行为类模式PK
行为类模式包括:
- 责任链模式
- 命令模式
- 解释器模式
- 迭代器模式
- 中介者模式
- 备忘录模式
- 观察者模式
- 状态模式
- 策略模式
- 模板方法模式
- 访问者模式
行为型模式涉及到算法和对象间职责的分配
行为类模式关注如何管理对象的行为.
命令模式VS策略模式
策略模式和命令模式相似, 特别是命令模式退化时,比如无接收者(接收者非常简单或者接收者是Java的基础操作,无需专门写一个接收者), 这种情况下, 命令模式和策略模式的类图完全一样. 但是两者还是有区别的:
- 关注点不同. 策略模式关注的是算法替换的问题, 关注的是算法的完整性、封装性, 只有具备了这两个条件才能保证其可以自由更换
- 角色功能不同. 策略模式中的具体算法是负责一个 完整算法逻辑,它是不可再分的原子业务单元,一旦变更就是对算法整体的变更.而命令模式关注命令的实现, 也就是功能的实现, 命令模式中的接收者只要符合六大设计原则,完全不用关心它是否完成了一个具体逻辑,它的影响范围也 仅仅是抽象命令和具体命令, 对他的修改不会扩散到模式外的模块
- 使用场景不用. 策略模式适用于算法要求变换的场景, 而命令模式适用于解耦两个有紧耦合关系的对象场合或者多命令多撤销的场景
策略模式VS状态模式
策略模式和状态模式都是通过一个 Context 类封装一个具体的行为, 都提供了一个封装的方法,是高扩展性的设计模式. 但是, 策略模式封装的是不同的算法,而状态模式封装的是不同的状态. 两种模式虽然都有变换的行为, 但是两者的目标缺不同. 策略模式与状态模式不同点如下:
- 环境角色的职责不同. 两者都有一个Context 环境角色的类. 策略模式的环境角色只是一个委托作用,负责算法的替换; 而状态模式的环境角色不仅仅是委托行为,它还具有登记状态变化的功能,与具体的状态类协作,共同完成状态切换行为随之切换的任务
- 解决问题的重点不同. 策略模式旨在解决内部算法如何改变的问题, 也就是将内部算法的改变对外界的影响降低到最小; 而状态模式旨在解决内在状态的改变而引起行为改变的问题, 它的 出发点是事物的状态,封装状态 而暴露行为,一个 对象的状态改变,从外界来看就好像是行为改变.
- 解决问题的方法不同. 策略模式只是确保算法可以自由切换,但是什么时候用什么算法它决定不了; 而状态模式对外暴露的是行为,状态的变化一般是由环境角色和具体状态共同完成的, 也就是说状态模式封装了状态的变化而暴露了不同的行为或行为结果
- 应用场景不同. 策略模式的算法必须是平行的,否则就封装了一堆垃圾. 状态模式则要求有一系列状态发生变化的场景, 它要求有状态且有行为的场景.
- 复杂度不同. 通常策略模式比较简单, 这里简单是指结构简单,扩展比较容易,而且代码也容易阅读. 而状态模式通常比较复杂,因为它要从两个角色看到一个对象状态和行为的改变,也就是说它封装的是变化,而变化是无穷的, 因此相对来说状态模式通常都比较复杂, 涉及面很多,虽然也很容易扩展,但是一般不会进行大规模的扩张和修正
观察者模式VS责任链模式
这两个模式好像没有太多的相似性啊. 我们在观察者模式中, 一个具体的角色既可以是观察者, 也可以是被观察者, 这样就形成了一个观察者链.这与责任链模式非常相似, 都实现了事务的链条化处理. 但是他们还是有区别的, 区别如下:
- 链中的消息对象不同. 责任链模式基本上不改变消息对象的结构, 虽然每个节点都可以参与消费,但是它的结构不会改变, 比如从首节点传递进来一个String对象, 不会到链尾的时候成了int对象,这在责任链模式中式不可能的, 但是在观察者链中是允许的,链中传递的对象可以自由变化,只要上下级节点对传递对象了解即可,它不要求链中的消息对象不变化,只要求链中相邻两个节点的消息对象固定
- 上下节点的关系不同. 在责任链中, 上下节点没有关系, 都是接受同样的对象,所有传递的对象都是从链首传递过来,,上一节点是什么没有关系,只要按照自己的逻辑处理就成. 而观察者链就不同了, 它的上下级关系很亲密,下级对上级顶礼膜拜,上级对下级绝对信任,链中的任意两个相邻节点 都是一个牢固的独立团体
- 消息的分销渠道不同. 在责任链中,一个消息从链首传递进来后,就开始沿着链条想链尾运动, 方向是单一的,固定的; 而观察者链则不同, 由于它采用的是观察者模式,所以有非常大的灵活性,一个消息传递到链首后,具体怎么传递时不固定的,可以以广播方式传递,也可以以跳跃方式传递,这取决于处理消息的逻辑.