一个用go实现的有限状态机

aaa3450da0595daf86535184c6878957.png

图片拍摄于2022年2月4日,水村富士山。

easyfsm

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

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

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

这就是easyfsm的由来。

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

78e2131c9bcee42964239152b1c31be6.png

为什么需要区分业务?

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

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

整体设计:

cb1a5e22a350efa8cd8ec224ded4daff.png

简单解释一下:

  • 业务:比如有商品状态业务、订单状态业务.....

  • 状态:订单待付款、待发货....

  • 事件:对应状态仅可达事件集合。比如待付款状态的可达事件仅有:支付事件和取消事件(取决于自己的业务)

  • 执行事件主体:执行自定义的事件函数,如果有需要,还可以自定义执行事件前后hook,事件订阅者(比如支付事件发生后,异步通知用户等)

使用姿势

02408d73e5cdc32460bf4b2e8554c0ad.png

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

f1208bce8371508dea729fb0052b59e2.png

自定义事件主体,

f9f5d7ca21a81e5b41fdad2596dc0066.png

注册到easyfsm。

c609966f28ee5f9d226b451d55490010.png

开始使用。

5872bc898961608e9895d2a560a8266d.png

完整示例代码如下,

9ac6217a70fd3747b035a6340b68adc8.png


Hook

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

a13976b6cfbed75a63806380fe168bfc.png

我们可以实现这两个接口,

506e53870df26e318b1a04f8e32f60a6.png

完整代码:

6e78edffdf8952198ecaf2cb39865681.png

总结

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

如果有其他不一样的需求,欢迎大家在issue留言提需求。https://github.com/wuqinqiang/easyfsm

推荐阅读:

哇,14662 字解析 Go 语言 Context(附图)

资料下载

点击下方卡片关注公众号,发送特定关键字获取对应精品资料!

  • 回复「电子书」,获取入门、进阶 Go 语言必看书籍。

  • 回复「视频」,获取价值 5000 大洋的视频资料,内含实战项目(不外传)!

  • 回复「路线」,获取最新版 Go 知识图谱及学习、成长路线图。

  • 回复「面试题」,获取四哥精编的 Go 语言面试题,含解析。

  • 回复「后台」,获取后台开发必看 10 本书籍。

对了,看完文章,记得点击下方的卡片。关注我哦~ 👇👇👇

如果您的朋友也在学习 Go 语言,相信这篇文章对 TA 有帮助,欢迎转发分享给 TA,非常感谢!83b62d0a8b90c764f8e21a3e8e57283a.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值