状态模式(State)
定义:
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
特点:
主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。就是为了消除庞大的条件分支语句。
在子状态的行为中,需要设置其下一状态
示例:
/**
* 抽象状态类:依赖Context
*/
public abstract class State {
public abstract void handle(Context context);
}
/**
* Context类,理解为实体类,维护一个State实例
*/
public class Context {
private State mState;//引用,用于执行各子状态的行为
public Context(State state) {
this.mState = state;
}
public State getState() {
return mState;
}
//更新状态
public void setState(State state) {
this.mState = state;
}
//触发调用
public void request() {
//通过引用,来执行当前状态行为
mState.handle(this);
}
}
/**
* 子状态A,继承State
*/
public class ConcreteStateA extends State {
@Override
public void handle(Context context) {
//设置其下一状态,也可在此加入自己的其他动作
context.setState(new ConcreteStateB());
}
}
/**
* 子状态B,继承State
*/
public class ConcreteStateB extends State {
@Override
public void handle(Context context) {
//设置其下一状态,也可在此加入自己的其他动作
context.setState(new ConcreteStateA());
}
}
实际使用中,
//初始状态为A
Context context = new Context(new ConcreteStateA());
context.request();//此时执行状态A行为,将把状态更新为B
context.request();//此时执行的是状态B行为,同时又把状态更新为A