设计模式之行为类模式大PK
2016-12-12 08:59
218 查看
行为类模式大PK |
命令模式VS策略模式 |
接下来我们从对文件压缩的业务需求出发,分别按照命令模式和策略模式设计出一套实现,来看看他们侧重点的不同。文件的压缩其中有两种格式zip和gzip,他们是两种不同的压缩格式,我们将分别实现不同格式的压缩和解压缩功能。
命令模式实现对文件的压缩和解压缩
命令模式的主旨是封装命令,使请求者和实现者解耦。我们先看看命令模式实现文件压缩和解压缩的类图:
public class Human { //人生有三种状态童年、成年和老年 public static HumanState childState = new ChildrenState(); public static HumanState adultState = new AdultState(); public static HumanState oldState = new OldState(); public HumanState state = null; public void setHumanState(HumanState state){ this.state = state; this.state.setHuman(this); } public void work(){ this.state.work(); } } public abstract class HumanState { protected static Human human = null; public void setHuman(Human human){ this.human = human; } public abstract void work(); } public class ChildrenState extends HumanState{ @Override public void work() { // TODO Auto-generated method stub System.out.println("童年是最无忧无虑的,在家的港湾的庇护下快乐的成长"); //切换到下一个人生状态 super.human.setHumanState(Human.adultState); } } public class AdultState extends HumanState{ @Override public void work() { // TODO Auto-generated method stub System.out.println("成为了社会的中坚力量,有了自己的家庭和事业"); super.human.setHumanState(Human.oldState); } } public class OldState extends HumanState{ @Override public void work() { // TODO Auto-generated method stub System.out.println("一路上收藏点点滴滴的微笑,坐着摇椅和心爱的人慢慢聊"); } } public class Client { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Human human = new Human(); human.setHumanState(new ChildrenState()); human.work(); //有状态切换在ChildrenState的work() human.work(); human.work(); } }
View Code
总结
从上人生的例子中可以看出,状态模式侧重的是人的生长规律,而策略模式侧重的是人的工作逻辑,不同的人生阶段工作不同。
环境角色的职责不同:两者都有一个叫Context环境角色的类,但是两者的区别很大,策略模式的环境角色只是一个委托作用,负责算法的替换;而状态模式的环境角色不仅仅是委托行为,它还具有登记状态变化的功能,与具体的状态类协作,共同完成状态切换行为随之切换的任务。
解决问题的重点不同:策略模式旨在解决内部算法如何改变的问题,也就是将内部算法的改变对外界的影响降低到最小,保证算法之间的自由切换;而状态模式旨在改变内部状态的改变而引起的行为的改变的问题,出发点是事务的状态,状态封装而暴露行为,一个对象状态的改变,从外界来看就好像是行为改变。
解决问题的方法不同:策略模式解决算法自由切换,但是什么时候用什么算法它决定不了,而装填模式对外暴露行为,状态的变换一般是由环境角色和具体状态共同完成的,也就是说装填模式封装了状态变化而暴露了不同的行为或行为结果。
应用场景不同:策略模式是算法的封装,可以是一个有意义的对象,也可以是一个无意义的逻辑片段,如MD5加密算法,算法必须是平行的;状态模式则要求有一系列状态发生变化的场景,他要求的是有状态且有行为的场景,也就是一个对象必须有二维(状态和行为)描述才能采用状态模式。
复杂度不同:策略模式结构比较简单,容易扩展,而状态模式通常比较复杂,因为他要从两个角色看到一个对象状态和行为的改变,也就是说封装的是变化。
观察者模式VS责任链模式 |
小结
通过如上例子,我们发现触发链和责任链虽然都是链结构,但是还是有区别的。
链中的消息对象不同:责任链模式中消息在链中传递时,消息的结构基本不会改变,而观察者模式中消息可以自由改变,只要上下级节点对传递对象了解即可,观察者模式只要求联众相邻两个结点的消息对象固定。
上下节点的关系不同:在责任链模式中,上下节点没有关系,都是接收同样的对象,所有传递的对象都是从链首传递过来;而观察者模式的上下节点关系密切,链中任意两个相邻接点都是一个牢固的独立团体。
消息的分销渠道不同:在责任链模式中,消息从链首向链尾沿着单一固定的方向传递;而观察者模式则不同,消息的传递灵活性较大,一个消息具体怎传递时不固定的,可以以广播方式传递,也可以以跳跃方式传递,这取决于处理消息的逻辑。
相关文章推荐
- 设计模式之禅之行为类PK【命令模式VS策略模式】
- 设计模式之禅之行为类PK【策略模式VS状态模式】
- 设计模式-行为模式
- 设计模式 pk
- java 设计模式 行为模式 -Memento(备忘录模式)
- Java设计模式_行为模式_观察者模式
- 设计模式-行为模式(Command)
- [Design] 设计模式行为模式
- 设计模式的分类,创建模式,结构模式,行为模式
- 设计模式--行为型模式之一--Chain of Responsibility 行为链
- 设计模式:浅谈行为模式State(C/C++ C#)
- MVVM设计模式之旅 – 通用的命令附加行为
- 设计模式-行为模式(Observer)
- 设计模式--Template Method --行为
- 设计模式行为模式Behavioral Patterns()之FlexibleService模式
- 设计模式行为模式Behavioral Patterns之FlexibleService模式
- (行为模式)设计模式之Template
- 设计模式之行为模式(一)
- Design Pattern(设计模式- 行为模式)-------Observer(观察者)
- 设计模式学习-行为模式-职责链模式