1. 状态模式基础概念
状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为。这种模式的核心思想是将对象的状态抽象为独立的类,并将与特定状态相关的行为封装在这些类中。当我看完《设计模式:可复用面向对象软件的基础》这本书后,第一次真正理解状态模式时,有种豁然开朗的感觉——原来复杂的条件判断可以如此优雅地重构。
1.1 状态模式的定义与特点
状态模式通过将每个状态的行为封装在独立的类中,使得状态转换更加明确和可维护。在我的项目实践中,状态模式通常包含以下几个关键组成部分:
- Context(上下文):定义客户端需要的接口,维护一个ConcreteState子类的实例,这个实例定义当前状态
- State(状态):定义一个接口以封装与Context的一个特定状态相关的行为
- ConcreteState(具体状态):每个子类实现一个与Context某个状态相关的行为
状态模式最显著的特点是允许对象根据内部状态改变其行为,而且这种改变看起来就像是对象改变了它的类一样。这实际上是通过组合和委托来实现的,而不是通过继承。
1.2 状态模式与有限状态机
状态模式与有限状态机(Finite State Machine, FSM)概念紧密相关。有限状态机由一组状态、一个初始状态、输入和基于输入及当前状态的状态转换函数组成。在软件开发中,我们经常需要实现各种状态机,而状态模式提供了一种面向对象的实现方式。
我记得在一个电商订单系统的开发中,订单有"待支付"、"已支付"、"已发货"、"已完成"等多种状态,每个状态下对订单的操作逻辑完全不同。最初我们使用大量的if-else语句来处理不同状态下的行为,但随着状态增多和业务逻辑复杂化,代码变得难以维护。后来重构为状态模式后,代码清晰度和可维护性都得到了极大提升。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 状态模式的结构与实现
2.1 状态模式的UML类图
状态模式的典型UML类图结构如下:
code复制Context → State
State ← ConcreteStateA
State ← ConcreteStateB
在这个结构中:
- Context维护一个ConcreteState子类的实例,这个实例定义当前状态
- State定义一个接口,封装与Context特定状态相关的行为
- ConcreteState子类实现与Context某个状态相关的行为
2.2 状态模式的代码实现
让我们通过一个简单的Java示例来展示状态模式的基本实现。假设我们要实现一个电灯开关的状态控制:
java复制// State接口
interface LightState {
void switchOnOff(LightContext context);
}
// 具体状态:开状态
class LightOnState implements LightState {
@Override
public void switchOnOff(LightContext context) {
System.out.println("Turning light off...");
context.setState(new LightOffState());
}
}
// 具体状态:关状态
class LightOffState implements LightState {
@Override
public void switchOnOff(LightContext context) {
System.out.println("Turning light on...");
context.setState(new LightOnState());
}
}
// Context类
class LightContext {
private LightState currentState;
public LightContext() {
this.currentState = new LightOffState(); // 初始状态为关
}
public void setState(LightState state) {
this.currentState = state;
}
public void switchOnOff()
