一、概述
概念
再引用网友的说通俗一点:
State模式在实际使用中比较多,适合"状态的切换"。因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了。
不只是根据状态,也有根据属性。如果某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比较高,我们经常会在一个数据表的尾部,加上property属性含义的字段,用以标识记录中一些特殊性质的记录,这种属性的改变(切换)又是随时可能发生的,就有可能要使用State。一些类似旋转开关(从1切换到2,再切换3...)的时候,应该想到状态模式了!
UML简图
角色
抽象状态角色:定义接口,封装环境对象特定状态对应的行为
具体状态角色:实现环境状态对应的行为
环境角色:定义客户端感兴趣的接口,保留具体状态类的实例
二、实践
把上面的UML简图给出示意性代码
抽象状态
/**
* 抽象状态接口
*
* @author Administrator
**/
public interface State {
void operation();
}
具体状态(实际会有多个,这里给出一个示意性的)
/**
* 具体状态角色
*
* @author Administrator
**/
public class ConcreteState implements State{
@Override
public void operation() {
// 具体逻辑
}
}
环境角色
/**
* 环境角色
*
* @author Administrator
**/
public class Context {
private State state;
public void setState(State state) {
this.state = state;
}
public void operation() {
state.operation();
}
}
这里需要再次指出,模式对应的是状态的“旋转改变”——比如电梯开门,下一个状态应该是电梯关门,电梯关门,下一个状态应该是电梯上下行,
在之前,我们可以通过if..else来强制实现,但会显得逻辑混乱,难以维护!
一个完整的案例分析,请参见:http://blog.csdn.net/taozi8023/article/details/51456769
三、改进与思考
一个通过客户端切换状态的简单实例参见:http://ifeve.com/state-design-pattern-in-java-example-tutorial/
由浅入深,强力推荐:http://blog.csdn.net/u012401711/article/details/52675873