定义 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类
类图
通用代码
//抽象环境角色
public abstract class State {
//定义一个环境角色,提供子类访问
protected Context context;
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
public abstract void handle1();
public abstract void handle2();
}
//环境角色
public class ConcreteState1 extends State {
@Override
public void handle1() {
//被状态下必须处理的逻辑
}
@Override
public void handle2() {
//设置当前状态为state1
super.context.setCurrentState(Context.STATE2);
//过渡到state2状态,由Context实现
super.context.handle2();
}
}
public class ConcreteState2 extends State {
@Override
public void handle1() {
super.context.setCurrentState(Context.STATE1);
super.context.handle1();
}
@Override
public void handle2() {
}
}
//具体环境角色
public class Context {
public final static State STATE1=new ConcreteState1();
public final static State STATE2=new ConcreteState2();
//当前状态
private State CurrentState;
//获得当前状态
public State getCurrentState() {
return CurrentState;
}
//定义状态
public void setCurrentState(State currentState) {
CurrentState = currentState;
this.CurrentState=currentState;
this.CurrentState.setContext(this);
}
//行为委托
public void handle1() {
this.CurrentState.handle1();
}
public void handle2() {
this.CurrentState.handle2();
}
}
//场景类
public class Client {
public static void main(String[] args) {
//定义环境角色
Context context = new Context();
//初始化状态
context.setCurrentState(new ConcreteState1());
//行为执行
context.handle1();
context.handle2();
}
}
优点
1. 结构清晰
2. 遵循设计原则。很好的体现了开闭原则和单一职责原则
3. 封装性非常好
缺点
子类会很多,每个状态都有一个子类
使用场景
1. 行为随状态改变而改变的场景
2. 条件,分支判断语句的替代者
注意事项
状态模式适用于当某个对象在它的状态发生改变时,它的行为随着发生比较大的变化,即行为受状态约束的情况下可以使用状态模式