一、介绍
状态模式和策略模式从UML图上看是非常相似的,但是他们之间的差别确实巨大的,状态模式强调的是我现在处于什么状态,我这个状态之后我可以做什么。我不可以做什么,而且状态之间的切换至在具体状态子类中进行切换的。他不像策略模式,具体策略是平行的,没有关系的。状态模式中各个状态是有关系的。
二、代码结构介绍
列举一个简单的电风扇开关例子
2.1、抽象状态角色
public interface State {
//每个方法都持有上线文对象,这样可以在子类中切换上线文的状态
void start(Context context);
void close(Context context);
}
2.2、具体状态角色
public class StartState implements State {
//已经是开始状态,不能再次开启
@Override
public void start(Context context) {
throw new RuntimeException("already starting");
}
//已经是开始状态,可以关闭,然后切换状态
@Override
public void close(Context context) {
System.out.println("ready to close");
context.setState(new CloseState());
}
}
public class CloseState implements State {
//已经是关闭状态,可以再次开启
@Override
public void start(Context context) {
System.out.println("ready to start");
context.setState(new StartState());
}
//已经是关闭状态,不能再次关闭
@Override
public void close(Context context) {
throw new RuntimeException("already close");
}
}
2.3、上线文角色
public class Context {
private State state;
public Context(State state) {
this.state = state;
}
public void setState(State state) {
this.state = state;
}
public State getState() {
return state;
}
public void doStart(){
state.start(this);
}
public void doClose(){
state.close(this);
}
}
2.3、客户端调用
public class MainJob {
public static void main(String[] args) {
StartState startState = new StartState();
Context context = new Context(startState);
context.doStart();
context.doClose();
}
}
三、优点
解决if else if else 这种多重结构,而且增加状态很容易,非常易于维护。