1. 订单管理中存在的问题
订单管理中,订单存在未支付,派单中,服务中,已完成等等状态,所以在业务代码中,都是首先判断订单的状态,然后根据不同状态执行不同的逻辑。
在业务代码中对订单状态进行硬编码,如果有一天更改了业务逻辑就需要更改代码,不方便进行系统扩展和维护。
另外对订单状态的管理,散落在很多地方不方便对订单状态进行统一管理和维护。
2. 为什么使用状态机
在实际业务场景中,特别是对于复杂状态的管理(如订单状态、支付状态等),传统方式通常是直接在代码中硬编码状态转换逻辑,例如使用 if-else
或 switch-case
判断状态。然而这种方式有几个缺点:
- 扩展性差:如果要新增或修改状态转换逻辑,需要在多处修改代码,容易引入问题。
- 维护性差:随着业务逻辑变得复杂,状态管理分散在各个地方,难以统一管理。
- 代码可读性差:状态与事件之间的关联性不强,导致代码结构混乱。
状态机通过将状态转换逻辑集中管理,提供了统一的管理方式,避免了硬编码问题,提升了系统的扩展性和可维护性。
3. 什么是状态机设计模式
状态机设计模式是一种编程模式,用于解决某个对象在不同状态之间的转换问题。通过使用状态机,程序可以更加直观地管理对象的状态变化,并且避免了在业务代码中硬编码状态逻辑。其核心思想是:对象有多个状态,状态可以通过某些事件发生变化,每次状态变化时可能会触发一些动作。
状态机设计模式解决了在复杂业务中,尤其是像订单管理等系统,状态间的相互切换以及行为变化难以维护的问题。通过抽象化状态与事件的关系,使代码更加可维护、可扩展。
4. 状态机的核心要素
状态机设计模式包含四个核心要素:
- 现态(Current State):对象当前的状态。
- 事件(Event):触发状态变化的事件。
- 动作(Action):当事件发生时,执行的操作。
- 次态(Next State):当事件触发后,对象转换到的新状态。
通过这四个元素,可以构建出一个对象从一种状态到另一种状态的转换流程。
5. 使用状态机优化代码
以待支付状态到派单中状态举例:
现态:订单当前处于待支付状态那么现态为待支付。
事件:用户支付成功为事件,支付成功是条件,当条件满足进行状态迁移。
动作:将订单状态由待支付更改为派单中。
次态:派单中。
使用状态机优化代码:
(1)支付成功更改订单状态的代码优化如下:
if(支付状态==支付成功){
//调用状态机执行支付成功事件
orderStateMachine.changeStatus(id,支付成功事件);
}
(2)订单取消的代码优化如下:
orderStateMachine.changeStatus(id,订单完成时取消订单事件);
使用状态机的代码并没有对订单状态进行硬编码,只是指定了订单id和事件名称,执行changeStatus方法后自动更改订单的状态。
6. 总结
状态机就是对状态进行统一管理的数学模型,应用在软件领域是状态机设计模式,有了状态机就可以避免在业务代码中对状态进行硬编码,增加系统的可扩展性。状态机设计模式包括四个要素:现态、事件、动作、次态。
1、现态:是指当前所处的状态。
2、事件:当一个条件被满足,状态会由现态变为新的状态,事件发生可能会触发一个动作,或者执行一次状态的迁移。
3、动作:发生事件执行的动作,动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的。
4、次态:条件满足后要迁往的新状态。
通过状态机更改状态只需要指定事件名称即可,避免了状态字段在代码中硬编码。