状态模式
1 概述
- 状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为。状态模式通过将状态的行为封装到不同的状态对象中,使得对象在不同状态下具有不同的行为。
- 这种模式通过引入状态对象,将状态的行为封装起来,从而使得状态的切换更加灵活和可扩展。
2 优缺点及应用场景
2.1 优点
- 1)状态与行为分离:状态模式将状态与行为封装在不同的对象中,使得状态切换更加灵活。
- 2)简化复杂状态逻辑:通过将状态相关的行为封装在状态对象中,简化了复杂的状态转换逻辑。
- 3)符合开闭原则:可以通过增加新的状态类来扩展新的状态和行为,而无需修改现有代码。
2.2 缺点
- 1)增加类的数量:每个状态都需要定义一个类,增加了系统的类数量。
- 2)状态切换复杂性:状态之间的切换可能会比较复杂,增加了维护难度。
2.3 应用场景
- 1)对象的行为依赖于状态:对象的行为依赖于其状态,并且需要根据状态进行切换的场景。
- 2)状态切换较为复杂:状态之间的转换逻辑比较复杂的场景。
- 3)需要扩展状态和行为:需要在不修改现有代码的情况下扩展新的状态和行为的场景。
3 结构
- 1)上下文(Context):维护一个状态对象的引用,定义了客户端需要的接口。
- 2)状态(State):定义状态的接口,封装与上下文的一个特定状态相关的行为。
- 3)具体状态(ConcreteState):实现状态接口,封装具体状态相关的行为。
4 实现
4.1 UML 类图

4.2 代码示例
interface State {
public void doAction(Context context);
}
class StartState implements State {
public void doAction(Context context) {
System.out.println("Player is in start state");
context.setState(this);
}
public String toString() {
return "Start State";
}
}
class StopState implements State {
public void doAction(Context context) {
System.out.println("Player is in stop state");
context.setState(this);
}
public String toString() {
return "Stop State";
}
}
class Context {
private State state;
public Context() {
state = null;
}
public void setState(State state) {
this.state = state;
}
public State getState() {
return state;
}
}
public class StatePatternDemo {
public static void main(String[] args) {
Context context = new Context();
StartState startState = new StartState();
startState.doAction(context);
System.out.println(context.getState().toString());
StopState stopState = new StopState();
stopState.doAction(context);
System.out.println(context.getState().toString());
}
}
Player is in start state
Start State
Player is in stop state
Stop State
5 总结
- 状态模式通过将状态的行为封装到不同的状态对象中,使得对象在不同状态下具有不同的行为。状态模式适用于对象的行为依赖于状态、状态切换较为复杂以及需要扩展状态和行为的场景。尽管状态模式增加了类的数量和状态切换的复杂性,但它在简化复杂状态逻辑、提高系统扩展性和灵活性方面具有显著优势。在实际应用中,需要根据具体需求合理使用状态模式,以实现灵活可扩展的系统设计。