一個用 go 實現的有限狀態機
easyfsm
之前看過新亮老哥的 go-fsm-order,感覺還不錯。最近在遷移項目的時候,發現有多處業務存在一些狀態的流轉,所以就基於 go-fsm-order 做了重改,讓它可以在不同的業務場景下使用。
爲什麼不使用 looplab/fsm,star 挺多的啊。
不是特別喜歡,每次實例化 fsm 都需要重新傳遞對應 events(雖然我們可以統一封裝),我更期望在項目啓動時把此項目涉及到不同業務狀態機流轉註冊到 fsm,對應: 不同業務 ->[狀態]->[事件]-> 處理事件主體 (包含 handler、params、hooks、observers 等)。
這就是 easyfsm 的由來。
當你開始進行狀態流轉時,只需要,
爲什麼需要區分業務?
因爲絕大多數業務的狀態值都是從數據庫中獲取的,比如訂單表的訂單狀態,商品表中的商品狀態,有可能值是相同的。
同一個業務同一屬性對應狀態值表達單一,不同業務下屬性狀態可能會出現值相同,但所表達的含義是不同的。
整體設計:
簡單解釋一下:
-
業務: 比如有商品狀態業務、訂單狀態業務.....
-
狀態:訂單待付款、待發貨....
-
事件:對應狀態僅可達事件集合。比如待付款狀態的可達事件僅有: 支付事件和取消事件 (取決於自己的業務)
-
執行事件主體:執行自定義的事件函數, 如果有需要,還可以自定義執行事件前後 hook,事件訂閱者 (比如支付事件發生後,異步通知用戶等)
使用姿勢
首先自定義業務、狀態、事件。
自定義事件主體,
註冊到 easyfsm。
開始使用。
完整示例代碼如下,
Hook
如果想在處理事件函數的前後執行一些 hook,或者在事件執行完畢,異步執行一些其他業務,easyfsm 定義了這兩個接口,
我們可以實現這兩個接口,
完整代碼:
總結
上面簡單介紹了下 easyfsm 設計以及對應使用姿勢。
如果有其他不一樣的需求,歡迎大家在 issue 留言提需求。https://github.com/wuqinqiang/easyfsm
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/oo3Y9cB8bEk1CnOg71q9Jw