Java中用多态实现订单状态流转的核心是将不同状态下对同一操作的行为封装到各自状态类中,定义OrderState接口规范pay/ship/cancel行为,各状态类(如待支付、已支付)实现并校验合法性,OrderContext持状态引用并委托调用,状态变更时替换state实例,业务逻辑与状态决策分离以避免爆炸式扩展。

在 Java 中,用多态实现订单状态流转处理,核心是把“不同状态下对同一操作(如支付、发货、取消)的不同行为”封装到各自的状态类中,让调用方无需 if-else 判断状态,只需统一调用方法,由实际对象决定执行逻辑。
定义状态接口或抽象类
先抽象出订单的通用行为,比如 pay()、ship()、cancel()。所有具体状态都实现该接口,各自提供符合当前状态规则的实现。
例如:
interface OrderState {
void pay(OrderContext context);
void ship(OrderContext context);
void cancel(OrderContext context);
}
为每个状态编写具体实现类
每种状态(如待支付、已支付、已发货、已完成、已取消)都对应一个类,只允许合法操作,非法操作可抛异常或静默忽略。
立即学习“Java免费学习笔记(深入)”;
比如:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
待支付状态:允许支付、允许取消;调用
ship()抛IllegalStateException -
已支付状态:允许发货、允许取消;调用
pay()抛异常(重复支付) - 已发货状态:只允许完成或取消(部分业务允许);禁止再支付或再次发货
用上下文类持有当前状态并委托调用
OrderContext 是订单的“外壳”,内部持有一个 OrderState 引用,并提供对外统一的操作入口。状态变更时,只需替换内部 state 实例。
示例片段:
class OrderContext {
private OrderState state;
void pay() { state.pay(this); }
void ship() { state.ship(this); }
void cancel() { state.cancel(this); }
// 状态变更由状态类内部触发,比如:
void changeState(OrderState newState) {
this.state = newState;
}
}
当某状态类执行完自身逻辑后(如支付成功),主动调用 context.changeState(new PaidState()),完成流转。
避免状态爆炸和逻辑分散的小技巧
状态类不应承担业务数据处理,只做状态合法性校验和状态变更决策;真正修改订单属性(如更新数据库、发消息)应放在 OrderContext 或单独的 service 层中,状态类通过回调或事件通知方式触发。
可配合枚举定义状态码,便于日志记录和排查;也可加简单工厂,根据状态码快速构造初始状态实例。

















