行为型-状态模式
2026/1/15大约 2 分钟Java设计模式行为型模式状态模式Java设计模式面向对象架构设计最佳实践代码优化
概述
状态模式(State Pattern)允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
适用场景
- 对象的行为依赖于它的状态,并且它必须在运行时刻根据状态改变它的行为
- 代码中包含大量与对象状态有关的条件语句
角色组成
- Context(环境类):维护一个State实例,定义当前状态
- State(抽象状态):定义一个接口以封装与Context的一个特定状态相关的行为
- ConcreteState(具体状态):实现与Context的一个状态相关的行为
代码实现
1. 抽象状态
public interface OrderState {
void handle(OrderContext context);
String getStateName();
}2. 具体状态
// 待支付
public class PendingPayState implements OrderState {
@Override
public void handle(OrderContext context) {
System.out.println("订单待支付,进行支付...");
context.setState(new PaidState());
}
@Override
public String getStateName() {
return "待支付";
}
}
// 已支付
public class PaidState implements OrderState {
@Override
public void handle(OrderContext context) {
System.out.println("订单已支付,准备发货...");
context.setState(new ShippedState());
}
@Override
public String getStateName() {
return "已支付";
}
}
// 已发货
public class ShippedState implements OrderState {
@Override
public void handle(OrderContext context) {
System.out.println("订单已发货,等待收货...");
context.setState(new ReceivedState());
}
@Override
public String getStateName() {
return "已发货";
}
}
// 已收货
public class ReceivedState implements OrderState {
@Override
public void handle(OrderContext context) {
System.out.println("订单已完成");
}
@Override
public String getStateName() {
return "已收货";
}
}3. 环境类
public class OrderContext {
private OrderState state;
public OrderContext() {
this.state = new PendingPayState();
}
public void setState(OrderState state) {
this.state = state;
}
public void handle() {
System.out.println("当前状态: " + state.getStateName());
state.handle(this);
}
}4. 客户端
public class Client {
public static void main(String[] args) {
OrderContext order = new OrderContext();
order.handle(); // 待支付 -> 已支付
order.handle(); // 已支付 -> 已发货
order.handle(); // 已发货 -> 已收货
order.handle(); // 已完成
}
}# 输出
当前状态: 待支付
订单待支付,进行支付...
当前状态: 已支付
订单已支付,准备发货...
当前状态: 已发货
订单已发货,等待收货...
当前状态: 已收货
订单已完成类图
状态模式 vs 策略模式
| 特性 | 状态模式 | 策略模式 |
|---|---|---|
| 关注点 | 状态转换 | 算法替换 |
| 状态变化 | 自动切换 | 客户端指定 |
| 对象感知 | 知道其他状态 | 不知道其他策略 |
| 使用场景 | 状态机 | 算法选择 |
优缺点
优点:
- 封装了转换规则
- 将所有与某个状态有关的行为放到一个类中
- 允许状态转换逻辑与状态对象合成一体
缺点:
- 状态模式的使用必然会增加系统类和对象的个数
- 状态模式的结构与实现都较为复杂
