关于golang:一个用go实现的有限状态机

53次阅读

共计 799 个字符,预计需要花费 2 分钟才能阅读完成。

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

正文完
 0