设计模式之状态模式--实现主体与判断逻辑间的解耦
2014-04-07 20:30
483 查看
一、前言
这几次写的博客感觉质量不是太好,主要的表现是大家的关注度比较低啊,写这个博客就是想在学习的过程中和大家多多的交流,对于那些懵懂的同学抛下砖头,可是这点也没有做好,个人还是很惭愧的,在这里借此机会向大家提出一点点请求,希望大家看完博客后有什么建议都可以提出来,帮助我改进嘛,毕竟还有其它同学会看,提意见的同时其实也帮助了其它同学,先谢谢大家了。二、状态模式之场景
状态模式是我们的系统设计中经常用到的设计模式了,主要作用是实现对状态的封装,很多人看到这句话都很不解,其实在我理解看来,与其说它是对特征的封装,还不如说它是对状态对应特定动作的封装;说白了就是当对象方法中逻辑判断的封装(这种逻辑判断必须和对象的当前状态相关),例如:一个关于人的类People,它有一个方法叫haul(),方法输出的是这个人大叫的内容,但是这个大叫的内容依据当前这个人的状态而定,当这个人处于高兴状态的时候他会叫“我好高兴”,当为沮丧的状态时,他会叫“我好伤心”,当他痛苦的时候,他会叫“我好痛苦”。三、状态模式前的土鳖方法
直接贴出土鳖代码如下:public class People { int state; public void haul(){ if(state == 0){ //高兴态 System.out.println("我好高兴"); }else if(state == 1){ //沮丧态 System.out.println("我好伤心"); }else if(state == 2){ //痛苦态 System.out.println("我好痛苦"); } } }
设想,我们的代码已经完成了,但是我们需要为People加入新的状态(幸福状态),针对这个“幸福”状态我需要修改haul中代码,嘿,如果你还记得开闭原则的话,就应该反思自己的这种做法(这一切都基于一个前提:我们需要改变People的状态)。
四、使用状态模式吧
有什么办法来改变上述结构同时还能满足开闭原则呢?很简单,我们只需要把需要改变的部分抽取出来,也就是我们需要封装该方法的各个输出部分。我们第一步需要做的是定义一个State的接口,该接口给出了hual的接口,然后针对不同的状态实现该接口,而在People中则不直接实现haul的代码,而是利用他所依赖的State对象来实现。下面给出状态模式的代码。public interface State { public void haul(); }
接下来针对各个不同的状态实现State接口
public class HappyState { public void haul(){ System.out.println("我好高兴"); } }
public class DepressedState { public void haul(){ System.out.println("我好伤心"); } }
public class PainState { public void haul(){ System.out.println("我好痛苦"); } }
实现了这么多不同状态下的hual动作,全都是为了使得People的代码更加具有可扩展性,既然有了State接口,我们为什么不面向接口编程呢?
public class People { State state; public State getState() { return state; } public void setState(State state) { this.state = state; } public void haul(){ state.haul(); } }
这样以来,不管日后我们想给People加多少个状态,都不需要再改变People的代码了。
五、心得
学习需要坚持不懈,话虽简单,又有多少个能做到呢?自信来源于“做”。相关文章推荐
- Head First 设计模式 (十) 状态模式(State pattern) C++实现
- 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)
- 《模式——工程化实现及扩展》(设计模式C# 版)《状态模式 State》——“自我检验" 参考答案
- 设计模式之第21章-状态模式(Java实现)
- 设计模式——行为型之命令模式(Command Pattern)让你的命令发起者和命令执行者的逻辑解耦(六)
- 【设计模式】使用unity实现状态模式(State mode)
- 设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 状态模式(State Pattern) - Java实现
- 设计模式系列6-----C++实现状态模式(State Pattern)
- 设计模式的应用-工厂方法实现3层模型解耦
- 设计模式C++实现(16)——状态模式
- 设计模式C++实现(16)——状态模式
- C语言实现状态设计模式
- iOS设计模式-Block实现代理的逻辑
- 设计模式C++实现(16)——状态模式
- 【游戏设计模式】之三 状态模式、有限状态机 & Unity版本实现
- 学习php设计模式 php实现状态模式
- 设计模式C++实现(16)——状态模式
- C++实现设计模式 - STATE(状态)—对象行为模式(第二十个)
- 设计模式C++实现(16)——状态模式
- 适配器(Adapter)设计模式和接口实现完全解耦