一、状态模式的概念
当一个对象的内部状态改变时允许改变其的行为,这个对象看起来好像修改了它的类
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同的一系列类当中,简化复杂的判断逻辑。
抽象状态类[State]:定义一个接口封装与Context的一个特定状态相关的行为
具体状态类[ConcreteState]:每个子类实现一个与Context的一个状态相关的行为
上下文[Context]:维护一个ConcreteState子类的实例,这个实例定义当前的状态
二、状态模式的实现
//抽象状态类
public Interface State{
public void change();
}
//具体状态类A
public class ConcreteStateA implements State{
private Context ctx;
public ConcreteStateA(Context ctx) {
this.ctx = ctx;
}
@Override
public void change() {
ctx.setState(ctx.getStateB());
System.out.println("current state is B");
}
}
//具体状态类B
public class ConcreteStateB implements State{
private Context ctx;
public ConcreteStateB(Context ctx){
this.ctx = ctx;
}
@Override
public void change() {
ctx.setState(ctx.getStateA());
System.out.println("current state is A");
}
}
//上下文
public class Context{
private ConcreteStateA stateA;
private ConcreteStateB stateB;
private State state;
public Context() {
this.stateA = new ConcreteStateA(this);
this.stateB = new ConcreteStateB(this);
this.state = stateA;
}
public void doChange(){
this.state.change();
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public ConcreteStateA getStateA() {
return stateA;
}
public void setStateA(ConcreteStateA stateA) {
this.stateA = stateA;
}
public ConcreteStateB getStateB() {
return stateB;
}
public void setStateB(ConcreteStateB stateB) {
this.stateB = stateB;
}
}
puublic class Test{
public static void main(String... args){
Context ctx = new Context();
ctx.doChange();
ctx.doChange();
ctx.doChange();
ctx.doChange();
ctx.doChange();
}
}
三、状态模式的应用
- 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为
- 代码中包含大量与对象状态有关的条件语句,一个操作中含有大量分支的条件(if else(或switch case)语句
四、状态の其他问题
状态模式将与某个状态有关的行为放到一个类中,可以增加新的状态,改变对象状态即可改变对象的行为
状态模式会增加系统类和对象的个数,且状态模式的结构与实现都较为复杂
策略模式是让用户指定更换的策略算法, 状态模式是状态在满足一定条件下的自动更换,用户无法指定状态,最多只能设置初始状态。
五、Reference
六、Resource