一、什么是状态模式
当一个对象的内在状态改变时,允许改变其行为。状态模式(State Pattern): 主要用来解决对象在多种状态下转换时需要对外输出不同的行为。
结构
状态模式包含以下几个主要角色:
**Contxet:**环境角色,用于维护State状态
抽象状态(State):定义了一个接口,用于封装与上下文相关的一个状态的行为。
具体状态(Concrete State):实现了状态接口,负责处理与该状态相关的行为。具体状态对象通常会在内部维护一个对上下文对象的引用,以便根据不同的条件切换到不同的状态。
二、实现
我们将创建一个 State 接口和实现了 State 接口的实体状态类。Context 是一个带有某个状态的类。StatePatternDemo ,我们的演示类使用 Context 和状态对象来演示 Context 在状态改变时的行为变化。
State接口
java
public interface State {
void doAction(Context context);
}
具体状态
java
public class StartState implements State {
@Override
public void doAction(Context context) {
System.out.println("设备启动中...");
context.setState(this);
}
@Override
public String toString() {
return "启动状态";
}
}
public class StopState implements State {
@Override
public void doAction(Context context) {
System.out.println("设备停止中...");
context.setState(this);
}
@Override
public String toString() {
return "停止状态";
}
}
Context 角色
java
public class Context {
private State state;
public Context() {
this.state = null;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
测试代码
java
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());
}
}
结果

三、状态模式总结
状态模式将每个状态的行为封装到一个类中,增强代码可读性。符合开闭原则,当状态过多时会产生很多状态类,系统会变得复杂、维护难度升级。使用场景当一个对象、事件有多种状态,对不同的状态要求有不同的行为时,可以考虑使用状态模式。