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

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

easyfsm


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


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


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


这就是easyfsm的由来。


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


1668515435351.jpg


为什么需要区分业务?


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

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

整体设计:


1668515447554.jpg


简单解释一下

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


使用姿势


1668515463815.jpg


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


1668515474413.jpg


自定义事件主体


1668515483669.jpg


注册到easyfsm


1668515493667.jpg


开始使用


1668515502911.jpg


完整示例代码如下


1668515518524.jpg


Hook


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


1668515530442.jpg


我们可以实现这两个接口


1668515538947.jpg


完整代码


1668515550751.jpg


总结


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

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

相关文章
|
Go 数据库 数据安全/隐私保护
Go实现随机加盐密码认证
Go实现随机加盐密码认证
288 0
|
存储 缓存 人工智能
基于Go的缓存实现
缓存是架构设计中的常用概念,本文基于Go实现了一个简单的缓存组件,支持最基本的缓存操作。
270 0
基于Go的缓存实现
|
存储 缓存 NoSQL
一文搞懂Go整合captcha实现验证码功能
一文搞懂Go整合captcha实现验证码功能
|
XML JSON Java
RPC框架之Thrift—实现Go和Java远程过程调用
RPC框架之Thrift—实现Go和Java远程过程调用
|
监控 测试技术 Go
用 Go 从零实现日志包 - 第零篇 序言
设计一个日志包,需要考虑的基础功能有日志级别设置、标准输出和文件、输出格式配置、日志的时间戳、文件与打印行号、正文。高级功能有按级别分类输出、支持结构化日志、支持日志轮转。
128 0
|
Go 数据安全/隐私保护
Go 实现 AES 加密 CBC 模式|Go主题月
密码分组链接模式 CBC (Cipher Block Chaining),这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。
318 0
|
Go
【Golang】panic和recover底层逻辑实现|Go主题月
在每个goroutine也有一个指针指向_panic链表表头,然后每增加一个panic就会在链表头部加入一个_panic结构体。当所有的defer执行完后,_panic链表就会从尾部开始打印panic信息了,也就是说先发生的panic先打印信息。
204 0
|
Go 索引 Python
Go 和Python中的闭包实现及使用
Go 和Python中的闭包实现及使用
111 0
go语言实现【队列】|二叉树的【先序遍历】【创建】
go语言实现【队列】|二叉树的【先序遍历】【创建】
go语言实现【队列】|二叉树的【先序遍历】【创建】
|
Java Go
Go语言实现多态
Go语言实现多态
235 0
Go语言实现多态