有限狀態機FSM(Finite State Machine)及實現方式介紹

1、爲何引入有限狀態機?

    最近作一個項目,項目中不少實體(Entity),每一個實體都有不少狀態(State),各狀態會通過不一樣事件(Event)觸發後轉換到另外一個狀態。這些事件包括但不限於:用戶頁面點擊觸發,生效時間或失效時間到達,其餘依賴實體狀態變動等。在狀態變動後還會有一系列動做(Action)處理。一旦相互依賴實體或實體自己狀態增多,狀態轉換變多,處理這些狀態的業務代碼也會分散在各處,代碼處理很容易漏掉,維護成本很高。因此考慮引入有限狀態機。html

2、什麼是有限狀態機?

  有限狀態機,也稱爲FSM(Finite State Machine),其在任意時刻都處於有限狀態集合中的某一狀態。當其得到一個輸入字符時,將從當前狀態轉換到另外一個狀態,或者仍然保持在當前狀態。任何一個FSM均可以用狀態轉換圖來描述,圖中的節點表示FSM中的一個狀態,有向(方向表示從一個初態轉換到次態)加權(權表示事件)邊表示輸入字符時狀態的變化。若是圖中不存在與當前狀態與輸入字符對應的有向邊,則FSM將進入「消亡狀態(Doom State)」,此後FSM將一直保持「消亡狀態」。狀態轉換圖中還有兩個特殊狀態:狀態1稱爲「起始狀態」,表示FSM的初始狀態。狀態6稱爲「結束狀態」git

在啓動一個FSM時,首先必須將FSM置於「起始狀態」,而後觸發一系列時間,最終,FSM會到達「結束狀態」或者「消亡狀態」。github

 

                                                 圖1:狀態轉換圖spring

說明:設計模式

在一般的FSM模型中,通常還存在一個「接受狀態」,而且FSM能夠從「接受狀態」轉換到另外一個狀態,只有在識別最後一個字符後,纔會根據最終狀態來決定是否接受所輸入的字符串。此外,也能夠將「其實狀態」也做爲接受狀態,所以空的輸入序列也是能夠接受的。less

1. 狀態機要素

狀態機可概括爲4個要素,即現態、條件、動做、次態。「現態」和「條件」是因,「動做」和「次態」是果。詳解以下:
①現態:是指當前所處的狀態。
②條件:又稱爲「事件」。當一個條件被知足,將會觸發一個動做,或者執行一次狀態的遷移。
③動做:條件知足後執行的動做。動做執行完畢後,能夠遷移到新的狀態,也能夠仍舊保持原狀態。動做不是必需的,當條件知足後,也能夠不執行任何動做,直接遷移到新狀態。
④次態:條件知足後要遷往的新狀態。「次態」是相對於「現態」而言的,「次態」一旦被激活,就轉變成新的「現態」了。
咱們能夠用狀態表了表示整個過程,以下圖所示。post

                                                       圖2:狀態轉換表ui

2. 有限狀態機表示方法

①狀態轉換圖,例如圖1url

②狀態轉換表,例如圖2設計

 

 3、有限狀態機實現方式

1. Java switch case 或者 Scala 模式匹配實現

 

2. Java枚舉實現

Java枚舉實現有限狀態機

 

3. 設計模式:狀態模式實現

 

4. 使用stateless4j實現

github地址:https://github.com/stateless4j/stateless4j

 

 

5. Spring Statemachine實現

github地址:https://github.com/spring-projects/spring-statemachine

 

 

6. Akka FSM 狀態機實現

github地址:https://github.com/akka/akka

 

 7. 經過squirrel-foundation實現

github地址:https://github.com/hekailiang/squirrel

相關文章
相關標籤/搜索