一個有限狀態機的C++實現
女主宣言
有限狀態機:表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學模型。它對數字系統的設計具有十分重要的作用。常見的計算機就是使用有限狀態機作為計算模型的;電腦遊戲設計中也經常使用有限狀態機模型。本文就講講一個狀態機的C++實現。
PS:豐富的一線技術、多元化的表現形式,盡在“HULK一線技術雜談”,點關注哦!
有限狀態機
什麼是有限狀態機?
簡單說就是作一件事可能會經過多個不同狀態的轉換, 轉換依賴於在不同時間發生的不同事件來觸發, 舉個例子,比如 TCP的狀態轉換圖, 在實現上就可以用FSM.
傳統的實現方案
if...else : 搞一大堆if else, 一個函式寫很長很長......
swich...case : 也搞一大堆一個函式寫很長很長......
FSM的實現方案
根據具體的業務需要, 將業務的處理流程定義為一個狀態機, 此狀態機中存在以下必要元素
根據業務需要, 拆解抽象出若干個不同狀態 State, 並確定此狀態機的初始狀態;
根據實現需要, 抽象出用於觸發狀態轉換的事件 Event;
為了處理一個Event, 需要定義狀態的轉換過程Transition;
狀態機要先判斷當前所處的狀態是否與當前發生的Event匹配(注意: 相同的狀態可能同時匹配多個Event)。
用張簡圖來說明一下
MachineSet可以同時管理多個Machine;
外部觸發的Event進入到MachineSet的事件佇列;
事件佇列裡的Event被順序處理, 被Dispatch到match的Machine;
Machine根據當前的所處的state和Event型別來判斷當前Event是否有效;
如果上面(4)中的Event有效, 則進行狀態轉換;
狀態轉換具體來說涉及到三個回撥函式:
6.1 當前state離開, 是第一個回撥,需要使用者根據實際需要處理;
6.2 trasition這個轉換過程, 是第二個回撥;
6.3 新state的進入, 是第三個回撥;
一個簡單的狀態機,差不多就是上面這些內容, 剩下的就是用程式語言把它實現出來了;
FSM的C++ 實現
一個用C++11實現的FSM的程式碼
https://github.com/DavidLiuXh/kuafu
實現簡介:
主要就是按deamo裡的思路, 封裝了以下幾個模組
MachineSet,
Machine,
Event,
Transition,
Predicate
對於Event的處理, 提供兩種方案:
直接使用MachineSet提供的StartBackground, 開啟一個work thread, 在這個work thread中不斷從儲存event的fifo佇列中獲取event後dispatch到各個machine;
不使用MachineSet提供的event fifo, 實現自己的MachineSetHandler, 將其例項註冊到MachineSet, 從event的派發;
一個具體的實現
我們來使用上面的FSM的實現來模擬一個使用者登陸的場景;
定義用到的Event和幾種不同的事件型別
定義用到的狀態機, 從 kuafu::StateMachine 繼承, 其中包括用過的幾種state和transition
在Birth()函式中構造 state和 transition, Birth()是StateMachine的一個虛擬函式, 每個使用者實現的Machine都需要實現它:
建立MachineSet, 並開始event處理執行緒
建立使用者定義的Machine, 設定初始狀態
設定state和transition相應的回撥
模擬event發生:
相關原始碼:
MachineSet:https://github.com/DavidLiuXh/kuafu/blob/master/fsm/machine_set.h
Machine:https://github.com/DavidLiuXh/kuafu/blob/master/fsm/machine.h
Event:https://github.com/DavidLiuXh/kuafu/blob/master/fsm/event.h
Transition:https://github.com/DavidLiuXh/kuafu/blob/master/fsm/transition.h
Predicate:https://github.com/DavidLiuXh/kuafu/blob/master/fsm/transition_predicate.h
kuafu::StateMachine:https://github.com/DavidLiuXh/kuafu/blob/master/fsm/machine.h
HULK一線技術雜談
由360雲平臺團隊打造的技術分享公眾號,內容涉及雲端計算、資料庫、大資料、監控、泛前端、自動化測試等眾多技術領域,通過夯實的技術積累和豐富的一線實戰經驗,為你帶來最有料的技術分享
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555491/viewspace-2218737/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Unity 中用有限狀態機來實現一個 AIUnityAI
- 從Promise的實現來看有限狀態機Promise
- 有限狀態機
- 前端狀態管理與有限狀態機前端
- 有限狀態機(FSM)的使用
- 狀態模式(c++實現)模式C++
- Unity——有限狀態機FSM修改Unity
- 在 .NET 中使用有限狀態機實現工作流建模 - Lloyd
- PHP 有限狀態機使用說明PHP
- 探索FSM (有限狀態機)應用
- c++ io條件狀態 的一個例子C++
- 實戰併發-使用分散式快取和有限狀態機分散式快取
- 從React Redux的實際業務場景來看有限狀態機ReactRedux
- 借鑑redux,實現一個react狀態管理方案ReduxReact
- 使用 Hooks 實現一個簡單的狀態管理器Hook
- java實現用一個變數表示多個屬性的狀態Java變數
- Go中的有限狀態機FSM的詳細介紹Go
- 「譯」有限狀態機在 CSS 動畫中的應用CSS動畫
- C++容器巢狀實現動態二維陣列C++巢狀陣列
- vue的狀態管理實現Vue
- 幾十行程式碼實現一個vue的狀態管理行程Vue
- 使用列舉實現狀態機來優雅你的狀態變更邏輯
- LaTeX TIKZ畫markov轉移圖(有限狀態機FSM圖)
- AI模組(有限狀態機、行為樹)-應用在cocos中AI
- FSM狀態機及C#反射實現邏輯C#反射
- JS手寫狀態管理的實現JS
- Android 沉浸式狀態列的實現Android
- 如何用 Python 實現超級瑪麗的介面和狀態機?Python
- 【架構設計】無狀態狀態機在程式碼中的實踐架構
- Android-沉浸式狀態列的實現Android
- vue實現一個動效柱狀圖Vue
- 狀態機
- 小tip-一種圖片載入狀態效果的實現
- c++ web框架實現之靜態反射實現C++Web框架反射
- 一個微信群的現狀
- TCP 三次握手和四次揮手圖解(有限狀態機)TCP圖解
- [譯]Flutter - 使用Provider實現狀態管理FlutterIDE
- 實現一個簡易的靜態伺服器伺服器