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
原文地址:https://mp.weixin.qq.com/s/qjQDgbnce21U1wjr3f05_Q