状态模式 State ,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑化。
//状态抽象类,定义一个接口以及封装与Context 的一个特定状态相关的行为
public abstract class State {
public abstract void Handle(Context context);
}
//Context 维护一个ConcreteState的实例,这个实例定义当前状态
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);
}
}
//State的具体状态子类,每一个子类实现一个状态
public class ConcreteStateA extends State {
//设置下一个状态是 B
@Override
public void Handle(Context context) {
context.setState(new ConcreteStateB());
System.out.println("当前状态" + context.getState().getClass().getName());
}
}
public class ConcreteStateB extends State {
//设置下一个状态是 A
@Override
public void Handle(Context context) {
context.setState(new ConcreteStateA());
System.out.println("当前状态" + context.getState().getClass().getName());
}
public static void main(String[] args) {
Context context = new Context(new ConcreteStateA());//初始化为状态A
//不断变化状态
context.Request();
context.Request();
context.Request();
context.Request();
}
}
输出
当前状态day12state.ConcreteStateB
当前状态day12state.ConcreteStateA
当前状态day12state.ConcreteStateB
当前状态day12state.ConcreteStateA