這幾天想研究下狀態(tài)機(jī),所以開始閱讀了squirrel的代碼,文檔提到了建議先學(xué)習(xí)下狀態(tài)機(jī)基礎(chǔ)知識。所以學(xué)習(xí)了這方面的知識。
狀態(tài)機(jī)的分類
按照uml2.4可以分為兩種類型的狀態(tài)機(jī)。分別是behavior state machine和protocol state machine。兩種類型的狀態(tài)機(jī)有很多相似之處,behavior state machine更關(guān)注行為的變化,protocol state machine則可以描述系統(tǒng)內(nèi)的狀態(tài)變化的生命周期(比如Java線程的生命周期)。
behavior state machine
-
示意圖image
首先看個(gè)狀態(tài)機(jī)的示意圖,主要描述的是銀行ATM自助取款機(jī)的狀態(tài)變化。
這里面有一些概念,大的可以分為vertex和transition。
vertex
如果把狀態(tài)機(jī)看作是個(gè)圖(graph)的話,可以把vertex看作圖的狀態(tài)節(jié)點(diǎn)??梢苑譃槿缦聝煞N
state
state可以描述狀態(tài),可以分為三種類型。分別是簡單狀態(tài)(simple state),復(fù)合狀態(tài)(composite state), 子狀態(tài)(submachine state)。
-
簡單狀態(tài)
簡單狀態(tài).png -
復(fù)合狀態(tài)
在簡單狀態(tài)中可以嵌套其他的狀態(tài)變化,如下圖
復(fù)合狀態(tài).png
這個(gè)復(fù)合狀態(tài)中,Nothing有子狀態(tài)idle,Configuring有子狀態(tài)NewValueSelection和NewValuePreview,NewValuePreview有兩個(gè)子狀態(tài)state1,state2。
- 子狀態(tài)機(jī)
這個(gè)url文檔原話說的是The state machine that contains the submachine state is called the containing state machine.怎么理解這句話呢?我的理解是父類狀態(tài)機(jī)包含子類狀態(tài)機(jī)的狀態(tài)。實(shí)際場景就是主子訂單,1筆主訂單可能包含多筆子訂單,主訂單和子訂單都有訂單狀態(tài),比如待支付,已支付,已取消,配送中,售后中等。
Pseudostate
有如下幾種類型,簡單可以理解為一些預(yù)定義的狀態(tài)。
-
Initial Pseudostate
初始化 -
Terminate Pseudostate
結(jié)束 -
Entry Point
進(jìn)入節(jié)點(diǎn) -
Exit Point
退出節(jié)點(diǎn) -
Choice選擇分支
-
Fork
多線程派發(fā) -
Join
線程歸并 -
Junction
結(jié)合 -
Shallow History Pseudostate
包含H的圓圈
淺復(fù)制 Deep History Pseudostate
包含H*的圓圈-
Final State
uml定義其為state的子類,但是不是一種pseudostate
結(jié)束狀態(tài)
transition
vertex對應(yīng)狀態(tài)機(jī)圖上的節(jié)點(diǎn),transition就有對應(yīng)的轉(zhuǎn)換。轉(zhuǎn)換一般如下描述
transition ::= [ triggers ] [ guard ] [ '/' behavior-expression ]
triggers是觸發(fā)事件,guard是檢查是否能觸發(fā)的約束,behavior-expression是觸發(fā)后會(huì)執(zhí)行的動(dòng)作。
舉個(gè)例子,
left-mouse-down(coordinates) [coordinates in active_window] / link:=select-link(coordinates);link.follow()
按下鼠標(biāo)左鍵(left-mouse-down(coordinates) )是一個(gè)trigger,但是不一定會(huì)觸發(fā),需要滿足guard約束(坐標(biāo)需要在激活的窗口 ),如果滿足就會(huì)觸發(fā)behavior:link和link.follow。
behavior state machine小結(jié)
重新看上面的behavior state machine示意圖,應(yīng)該就很好理解了。注意下Customer Authentication和Transaction中的兩個(gè)圓圈是Decomposition compartment ,簡單可以理解為隱藏其中的細(xì)節(jié)。
protocol state machine
大致內(nèi)容和上面一樣,protocol state machine可以描述對象的生命周期。先看個(gè)示意圖
-
示意圖User Account
protocol state machine的transition和上面的有點(diǎn)不同,它的表達(dá)式是
protocol-transition ::= [ pre-condition ] [trigger](https://www.uml-diagrams.org/common-behaviors.html#trigger-syntax) '/' [ post-condition ]
舉個(gè)例子,上面的圖New到Active,pre-condition是驗(yàn)證賬戶(比如身份證,手機(jī)號),激活賬號(trigger),post-condition(驗(yàn)證唯一性)。
參考資料
https://www.uml-diagrams.org/state-machine-diagrams.html
https://doc.qt.io/archives/qt-4.8/statemachine-api.html
https://sparxsystems.com/resources/tutorials/uml2/state-diagram.html
https://plantuml.com/zh/state-diagram













