java中用抽象类实现状态模式管理订单流转,核心是将各状态封装为继承抽象状态类orderstate的子类,订单context仅持状态引用并委托行为,通过state.pay()等调用解耦逻辑,状态切换由当前状态对象主动调用order.setstate()完成。

在 Java 中,用抽象类实现状态模式来管理订单流转,核心是把每个订单状态(如“待支付”“已发货”“已完成”)封装为独立的类,它们共同继承一个抽象状态类;订单(Context)只持有一个状态引用,所有状态变更和行为委托给当前状态对象处理,避免大量 if-else 或 switch 判断。
定义抽象状态类(OrderState)
它声明订单在各状态下共有的行为(如支付、发货、确认收货),并持有对订单上下文(Order)的引用,以便状态切换时能更新上下文的状态。
- 方法通常为 protected abstract 或 public abstract,不提供默认实现(也可加空实现或抛 UnsupportedOperationException 作为占位)
- 构造器接收 Order 实例,用于后续调用 order.setState(...) 完成状态迁移
- 避免在抽象类中维护具体状态逻辑,保持职责清晰
为每种状态编写具体子类(PendingPaymentState、ShippedState…)
每个子类覆盖抽象方法,实现该状态下合法的操作,并在必要时触发状态转移。例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 待支付状态 允许支付成功 → 转为“已支付”;不允许发货或确认收货(可抛异常或静默忽略)
- 已支付状态 允许发货 → 转为“已发货”;不允许重复支付
- 已发货状态 允许买家确认收货 → 转为“已完成”;也支持物流超时自动完成等扩展逻辑
关键点:状态变更不是由 Order 类控制流程,而是由当前状态对象主动调用 order.setState(new CompletedState(order)) 完成。
设计订单上下文(Order)
它不关心具体状态逻辑,只负责持有当前状态引用,并把用户请求(如 pay()、ship()、confirm())转发给当前状态对象。
- 状态字段声明为 private OrderState state,初始设为 PendingPaymentState
- 提供 setState(OrderState newState) 方法更新状态,并可在此处记录状态变更日志或触发事件
- 所有业务方法(pay/ship/confirm)仅做一层代理:
state.pay(),完全解耦
使用示例与注意事项
客户端代码简洁直观:
Order order = new Order("ORD-001");
order.pay(); // 自动从待支付 → 已支付
order.ship(); // 自动从已支付 → 已发货
order.confirm(); // 自动从已发货 → 已完成
- 新增状态只需添加新子类 + 少量修改 setState 调用,符合开闭原则
- 状态间跳转规则集中在各子类中,逻辑内聚,易于单元测试
- 注意避免循环依赖:Order 持有 State,State 又持有 Order —— 使用构造传入即可,无需双向强引用
- 如需持久化状态,可在 setState 中同步更新数据库字段(如 status_code),或配合事件机制解耦
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










