定义
状态模式(State Pattern)是一种行为型设计模式,允许对象在其内部状态改变时改变其行为。该模式将状态的变化封装在状态对象中,从而使得对象的行为随着状态的变化而变化。
UML图
角色
- Context(上下文):持有一个当前状态的引用,并提供一个方法来改变状态。
- State(状态接口):定义一个接口,用于在不同状态下执行的行为。
- ConcreteState(具体状态):实现状态接口,定义在此状态下具体的行为。
代码
java
// 状态接口
interface State {
void handle(Context context);
}
// 上下文类
class Context {
private State currentState;
public Context(State initialState) {
currentState = initialState;
}
public void setState(State state) {
currentState = state;
}
public void request() {
currentState.handle(this);
}
}
// 具体状态 A
class ConcreteStateA implements State {
@Override
public void handle(Context context) {
System.out.println("Handling request in State A.");
context.setState(new ConcreteStateB()); // 切换到状态 B
}
}
// 具体状态 B
class ConcreteStateB implements State {
@Override
public void handle(Context context) {
System.out.println("Handling request in State B.");
context.setState(new ConcreteStateA()); // 切换到状态 A
}
}
// 测试状态模式
public class StatePatternDemo {
public static void main(String[] args) {
Context context = new Context(new ConcreteStateA());
context.request(); // 输出: Handling request in State A.
context.request(); // 输出: Handling request in State B.
context.request(); // 输出: Handling request in State A.
}
}
优点
- 简化代码:将与状态相关的行为封装在状态类中,减少了条件语句的复杂性。
- 状态易扩展:添加新状态时,只需增加新的状态类,而不需要修改已有的代码。
- 单一职责原则:每个状态的行为独立,符合单一职责原则。
缺点
- 状态类数量增多:每个状态都需要一个类,可能导致类数量增加,增加管理难度。
- 上下文与状态紧密耦合:上下文和状态之间的耦合较强,可能影响系统的灵活性。
适用场景
- 对象行为变化:如一个订单状态(待付款、已付款、已发货、已完成)在不同状态下的行为不同。
- 有限状态机:如游戏中的角色状态(静止、移动、攻击)。
- 工作流管理:如审批流程中各个状态之间的转换。