您的位置:首页 > 其它

设计模式之状态模式--实现主体与判断逻辑间的解耦

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的代码了。

五、心得

学习需要坚持不懈,话虽简单,又有多少个能做到呢?自信来源于“做”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息