狀態圖以可視化地方式將對象的各個生命周期展現出來,表現為一個個的狀態,狀態之間的流轉以及流轉觸發方式、觸發條件等。
例如此,有三個狀態,每個圓角矩形代表着一個狀態,狀態之間通過箭頭表示狀態流轉,箭頭上的文字說明表示流轉的觸發時間和條件。
1、基本元素
a、狀態(state)
一個對象,在其生命周期里會執行很多的命令,將這些命令進行歸類,就成了一個個的狀態,當觸發了某些事件,一個狀態會流轉到下一個狀態。
b、初態(initial)和終態(final)
初態:狀態機的起點,它能流轉到別的狀態,別的狀態不能流轉到它。
終態:狀態機的重點,代表着對象的聲明周期已經結束,只能由別的狀態流轉到它,它不能流轉到任何其他狀態。
c、流轉(Transitions)
流轉即狀態之間的變化,在StarUML里用箭頭表示,觸發狀態的流轉一定是出現了某個事情,所以流轉箭頭上一定包含觸發事件,除此之外還會包含其他一些元素
(1) 事件標識 它可以是一個信號、條件變化、時間表達式(調用事件(Call)、變化事件(Change)、時間事件(Time)和信號事件(Singal));
(2) 警戒條件 當事件發生之后,並不是所有的情況,都會發生狀態流轉的,還需要滿足警戒條件,才能流轉
(3) 結果 狀態流轉之后發生的事情(狀態流轉除了導致當前輸出的狀態變化,還會發生一些其他的結果,這里就是用於補充的)
一條流轉線上,可以增加多個,前提是 警戒條件和結果是一致的,如果不一致需要重新畫
添加多個事件的方法
添加結果的方法
添加警戒條件是在屬性里添加的
d、動作(State Action)
動作分為進、出兩個動作,這是狀態機一個非常強大的地方,對象在進入某個狀態的時候,在進動作里初始化一些變量,構建該狀態中命令集合的運行環境,而在出動作里,可以打掃戰場,清理一些變量,與進動作相呼應
添加進出動作的方法:雙擊狀態名
e、自身轉移(Self-Transitions)
狀態機中狀態的轉化中,還包含有自身狀態轉移
after 2 seconds 是事件,pull 是結果,其實pull 也可以放在waiting狀態中的進動作中,不過表意可能就沒有放在結果中那么好。
f、進入節點(Entry Point)、退出節點(Exit Point)
有的時候,對象沒有經過初始化,直接進入到某個狀態,叫做進入節點;
與此相對應的是退出節點,一般用於針對異常情況退出。
2、高級元素
a、組合狀態(Composed State)
組合狀態就是指狀態嵌套,一個狀態嵌套在另一個狀態里,模塊化設計中經常會用到這個。
b、歷史狀態
歷史狀態實際上不是一種狀態,而是一個邏輯,它的作用對象是組合狀態,當組合狀態中突然因為某個突發事件跳出了組合狀態,進入到外面的狀態,當再次進入到組合狀態的時候,不是從組合狀態的第一個狀態走起,而是從上次斷掉的狀態繼續往下走
如果在組合狀態”做飯”中的子狀態”做飯”執行的時候,突然累了,跳轉到”休息”狀態,當休息好了之后,從”休息”狀態跳回“做飯”狀態的時候,不需要重新開始,即不需要從“准備做飯”開始,而是從“做飯開始”。
c、並發區域(Concurrent Regions)
並發區域是針對於組合狀態的,對於狀態機來說,在一個時刻,對象只允許處於一種狀態,如果實際情況下出現兩種狀態同時運行,那么一般的做法是將兩個狀態合並成一個組合狀態,大狀態內部違背狀態機的唯一狀態的原則,以保證整個系統的遵守原則。並發區域由分叉引出,但不一定要由匯合結束。
3、案例
本文學習對象:https://blog.csdn.net/heshengfen123/article/details/9361959