状态模式指当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。我们实现一个复杂的状态机工作流时就可以使用状态模式解决。如果不用状态模式,一个方法将包含大量状态判断,十分难以维护。
下面我们实现一个状态模式代码。
State.java
public abstract class State {
public abstract void handle(Context context);
}
StateA.java
public class StateA extends State {
@Override
public void handle(Context context) {
context.setState(new StateB());
}
}
StateB.java
public class StateB extends State {
@Override
public void handle(Context context) {
context.setState(new StateA());
}
}
Context.java
public class Context {
private State state;
public Context(State state) {
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void request() {
state.handle(this);
}
}
Main.java
public class Main {
public static void main(String[] args) {
Context context = new Context(new StateA());
showState(context.getState());
context.request();
showState(context.getState());
context.request();
showState(context.getState());
}
private static void showState(Object o) {
System.out.println(o.getClass().getName());
}
}
上述代码,描述了两个状态A和B,用户每次调用request()
状态就切换一次。
首先思考,如果使用状态判断怎样实现这个状态机?肯定要维护一组状态常量了,然后每次状态转换时,都判断当前状态是哪个状态常量,然后根据状态机逻辑进行跳转。这是传统面向过程的写法。使用了状态模式后,值得注意的是,上面代码中的状态机并没有大量使用状态判断,而是使用状态类的handle()
和Context
类巧妙的解决了这个问题。