发布于2026-07-08 阅读(0)
扫一扫,手机访问
代码里一旦出现大量 if-else 或 switch-case 来判断对象状态、执行不同行为,维护成本就开始悄悄攀升了。更头疼的是,每次新增一个状态,都得去翻遍所有条件分支——改漏一个就是线上事故。有没有一种设计,能让状态变化本身决定该做什么,彻底跟那些冗长的条件判断说再见?状态模式就是干这个的。

一句话概括:把对象在不同状态下的行为封装成独立的类,对象内部状态发生变化时,其行为也随之自动切换。不是用 if-else 去“看”当前状态再决定做什么,而是直接让“状态本身”来决定——对象只管把请求委托给当前状态实例,行为与条件判断彻底解耦。
拿订单来举例再合适不过。一个订单对象通常有“待支付”“已支付”“已发货”“已完成”“已取消”等状态,每个操作(支付、发货、退款)都要先检查当前状态是否允许,再执行动作,最后更新状态。硬编码的结果就是:方法里塞满嵌套或并列的 if-else,看着就头疼。
这种写法的痛点很明显:
以订单为例,落地只要四步,非常清爽:
pay()、ship()、cancel()PaidState 实现 ship()(允许发货),但 pay() 直接抛异常或忽略OrderState 接口引用,初始设为 CreatedStateCreatedState.pay() 执行成功后,主动把订单的状态引用设为 new PaidState(order)这样一来,订单的 pay() 方法就简化为一行:currentState.pay(),零 if-else。
先看状态接口:
interface OrderState {
void pay(Order order);
void ship(Order order);
void cancel(Order order);
}
具体状态之一——已支付状态:
class PaidState implements OrderState {
@Override
public void pay(Order order) {
throw new IllegalStateException("Already paid");
}
@Override
public void ship(Order order) {
System.out.println("Shipping...");
order.setState(new ShippedState(order)); // 自行切换状态
}
@Override
public void cancel(Order order) {
System.out.println("Cancelling paid order...");
order.setState(new CancelledState(order));
}
}
订单类(精简版):
class Order {
private OrderState state;
public Order() {
this.state = new CreatedState(this);
}
public void pay() { state.pay(this); }
public void ship() { state.ship(this); }
public void cancel() { state.cancel(this); }
public void setState(OrderState state) { this.state = state; }
}
需要留意的是:状态类可以持有对上下文(Order)的引用,用于读取数据或触发状态变更,但要避免循环依赖。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8