状态机设计模式

1. 订单管理中存在的问题

订单管理中,订单存在未支付,派单中,服务中,已完成等等状态,所以在业务代码中,都是首先判断订单的状态,然后根据不同状态执行不同的逻辑。

在业务代码中对订单状态进行硬编码,如果有一天更改了业务逻辑就需要更改代码,不方便进行系统扩展和维护。

另外对订单状态的管理,散落在很多地方不方便对订单状态进行统一管理和维护。

2. 为什么使用状态机

在实际业务场景中,特别是对于复杂状态的管理(如订单状态、支付状态等),传统方式通常是直接在代码中硬编码状态转换逻辑,例如使用 if-elseswitch-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、次态:条件满足后要迁往的新状态。

通过状态机更改状态只需要指定事件名称即可,避免了状态字段在代码中硬编码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyt涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值