狀態(tài)機(jī)基礎(chǔ)知識

這幾天想研究下狀態(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容