前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个用go实现的有限状态机

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

原创
作者头像
RememberGo
发布2022-03-12 20:33:03
2.8K0
发布2022-03-12 20:33:03
举报
文章被收录于专栏:吴亲强的深夜食堂

easyfsm

一个用go实现的超容易上手的有限状态机。

它的特点:

  • 使用简单,快速理解。
  • 对应状态事件只需全局注册一次,不需要多处注册。
  • 支持不同业务->相同状态值->自定义不同事件处理器(下面会举🌰)

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

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

这就是easyfsm的由来。

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

为什么需要区分业务?

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

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

整体设计:

简单解释一下:

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

使用姿势

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

自定义事件主体,

注册到easyfsm。

开始使用。

完整示例代码如下,

Hook

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

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

完整代码:

总结

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • easyfsm
  • 使用姿势
  • Hook
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档