状态模式
状态模式又称为状态对象模式,该模式允许一个对象在其内部状态改变时改变其行为
状态模式的定义 当一个对象内在状态改变时允许其改变行为,这个对象看起来改变了其类
状态模式的参与者
- State 抽象状态角色: 该角色用以封装环境对像的一个特定状态所对应的行为
- Concrete State 具体状态角色: 该角色实现环境的一个状态所对应的行为
- Context 环境角色:该角色定义客户端需要的接口,并负责具体状态的切换。它会保留一个具体状态类的实例,该实例对象会给出环境对象的现有状态。
状态模式的简单示例
代码语言:javascript复制抽象状态角色
public abstract class State {
// 封装环境对象
protected Context context;
public void setContext(Context _context) {
this.context = _context;
}
// 定义状态下行为的忌口
public abstract void action();
}
具体对象角色
- ConcreteState1
public class ConcreteState1 extends State {
// 实现一个状态所定义的行为
@Override
public void action() {
System.out.println("The action of concrete state1");
}
}
- ConcreteState2
public class ConcreteState2 extends State {
@Override
public void action() {
System.out.println("the action of concrete state2");
}
}
代码语言:javascript复制上下文角色
public class Context {
public static State STATE1 = new ConcreteState1();
public static State STATE2 = new ConcreteState2();
// 具体状态类实例
private State currentState;
// 给出环境状态现有对象
public State getCurrentState() {
return currentState;
}
// 状态的切换
public void setCurrentState(State _currentState) {
this.currentState = _currentState;
currentState.setContext(this);
}
// 定义客户端需要的接口
public void handle1() {
this.setCurrentState(STATE1);
currentState.action();
}
// 定义客户端需要的接口
public void handle12() {
this.setCurrentState(STATE2);
currentState.action();
}
}
在上下文角色中,需要把状态对象声明为静态常量,有几个状态就要声明几个静态常量。 环境角色具有状态抽象角色的所有行为,具体执行使用委托方式。
状态模式的优缺点和应用场景
状态模式的优点
- 结构清晰
- 遵循设计原则
- 封装性良好
状态模式的缺点
- 子类太多,不易管理
状态模式的使用场景
- 对象行为依赖于它所处的状态,即行为随状态改变而改变
- 对象在某一个方法里依赖于一重或多条分支条件语句。