聊聊一个用 Go 实现的有限状态机

开发 项目管理
为什么需要区分业务?因为绝大多数业务的状态值都是从数据库中获取的,比如订单表的订单状态,商品表中的商品状态,有可能值是相同的。

easyfsm

之前看过新亮老哥的go-fsm-order,感觉还不错。最近在迁移项目的时候,发现有多处业务存在一些状态的流转,所以就基于go-fsm-order做了重改,让它可以在不同的业务场景下使用。

为什么不使用looplab/fsm,star挺多的啊。

不是特别喜欢,每次实例化fsm都需要重新传递对应events(虽然我们可以统一封装),我更期望在项目启动时把此项目涉及到不同业务状态机流转注册到fsm,对应:不同业务->[状态]->[事件]->处理事件主体(包含handler、params、hooks、observers等)。

这就是easyfsm的由来。

当你开始进行状态流转时,只需要:

为什么需要区分业务?

因为绝大多数业务的状态值都是从数据库中获取的,比如订单表的订单状态,商品表中的商品状态,有可能值是相同的。

同一个业务同一属性对应状态值表达单一,不同业务下属性状态可能会出现值相同,但所表达的含义是不同的。

整体设计:

简单解释一下:

  • 业务:比如有商品状态业务、订单状态业务.....
  • 状态:订单待付款、待发货....
  • 事件:对应状态仅可达事件集合。比如待付款状态的可达事件仅有:支付事件和取消事件(取决于自己的业务)
  • 执行事件主体:执行自定义的事件函数,如果有需要,还可以自定义执行事件前后hook,事件订阅者(比如支付事件发生后,异步通知用户等)

使用姿势

首先自定义业务、状态、事件。

自定义事件主体

注册到easyfsm

开始使用

完整示例代码如下

Hook

如果想在处理事件函数的前后执行一些hook,或者在事件执行完毕,异步执行一些其他业务,easyfsm定义了这两个接口。

我们可以实现这两个接口

完整代码

总结

上面简单介绍了下easyfsm设计以及对应使用姿势。

https://github.com/wuqinqiang/easyfsm

责任编辑:武晓燕 来源: RememberGo
相关推荐

2013-09-03 09:57:43

JavaScript有限状态机

2021-04-29 09:31:05

前端开发技术

2021-09-07 06:40:26

状态机识别地址

2014-05-21 11:09:56

前端有限状态机

2024-01-08 09:46:47

2023-04-12 07:14:31

Spring应用业务

2020-10-15 10:38:35

C语言状态模型

2024-10-10 17:46:06

2011-06-24 16:09:24

Qt 动画 状态机

2023-03-06 07:35:30

状态机工具订单状态

2020-12-02 13:33:58

函数指针编程语言

2010-06-18 12:38:38

UML状态机视图

2020-03-27 10:50:29

DSL 状态机工具

2010-06-18 13:25:44

UML状态机视图

2021-07-08 09:15:20

单片机编程状态机编程语言

2021-12-28 08:24:18

函数指针有限状态机编程

2023-05-10 08:05:41

GoWeb应用

2011-06-29 18:36:59

Qt 动画 状态机

2020-07-03 10:21:48

Go框架Docker

2024-01-08 08:36:29

HTTPGo代理服务器
点赞
收藏

51CTO技术栈公众号