这近在项目上用到了设计模式中的状态模式,我在这里写篇文章分享下学习经验。

状态模式给我们带来的好处和解决的一些问题:

我们让程序根据不同的外部情况来做出不同的响应,最直接的方法就是在程序中,将可能发生的外部情况全部考虑到,使用if else 语句来进行代码响应选择。但是这种方法对于复杂一点的状态判断,就会显得杂乱无章,容易产生错误、不利于维护;而且增加一个新的状态将会带来大量的修改。这个时候我们采用状态模式是个不错的选择。状态模式可以有效的替换在程序中的if else语句:将不同条件下的行为封装在一个类里面,再给这些类一个统一的父类来约束他们。如果我们需要新增一种状态,则只需要新增一种状态类就可以解决了,也省去了修改大量代码带来的麻烦。

下面列举一个java的列子:

一个篮球运动员的投篮手感状态,运动员的手感状态有[超常状态、正常状态、不好状态]

这时我们需要一个环境类,默认:这个运动员的状态是正常状态

public class Player {
//正常发挥
private State state = new NormalState();
/**
* 设置投篮的状态
* @param state
*/
public void setState(State state){
this.state = state;
}
public void shot(){
// TODO Auto-generated method stub
state.shot();
}
}

然后我们需要给运动员的投篮手感状态定义一个接口,然后让各种投篮手感状态去实现这个接口。

public interface State {
/**
* 公用的投篮结果方法
*/
public abstract void shot();
}

接下来我们就需要定义各种状态类了,这里我定义了3种状态,我只列举其中的一种了

/**
* 投篮超常的状态
*@authorjing.yue
* @version 1.0
*@since2012-07-4
*/
public class SuperState implements State {
@Override
public void shot() {
// TODO Auto-generated method stub
System.out.println("今天你投篮十中十");
}
}

最后一步就是投篮的测试类了,如果我们不指定状态,则默认为正常状态[投篮10中5]。我们还可以调用setState方法将运动员今天投篮的状态设置进去,然后调用shot方法来查看投篮的结果。

/**
* 投篮状态测试类
*@authorjing.yue
* @version 1.0
*@since2012-07-4
*/
public class TestState {
/**
* 状态模式用来处理条件判断等
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Player player = new Player();
//正常下投篮
player.shot();
//不正常下投篮
player.setState(new NonormalState());
player.shot();
//超常下投篮
player.setState(new SuperState());
player.shot();
}
}

这就是我对状态模式理解了。有不对的地方多多指教。