簡介
狀態可能有嵌套的子狀態,且子狀態可以在另一個狀態圖。子狀態又可分為兩種:與子狀態(and-substate),或子狀態(or-substate)。與子狀態指的是一個狀態可以有子狀態,但是一次只能有一個子狀態,如圖5.14所示。例如,一輛車可以處於運行態,它的運行態可以有兩個子狀態:前進和後退,它們是或子狀態,因為它們不能同時為真。嵌套的子狀態可以顯示在另一個狀態圖中,方法是在初始狀態圖中擴展運行狀態。
另一方面,運行態可能有多個並行的子狀態(與子狀態):前進和低速,前進和高速,後退和低速,後退和高速。當一個狀態有與子狀態且它們中的幾個可以同時為真時,表示一個狀態既有與子狀態也有或子狀態,如圖5—15所示。與子狀態也稱作並行狀態,可以用來抽象並行執行緒的狀態。
狀態圖
狀態圖主要用來描述對象、子系統、系統的生命周期。通過狀態圖可以了解到一個對象所能到達的所有狀態以及對象收到的事件(收到訊息,逾時,錯誤,條件滿足)對對象狀態的影響等。所有的類,只要它有可標記的狀態和複雜的行為,都應該有一個狀態圖。狀態圖指定對象的 行為以及根據不同的當前狀態行為之間的差別。同時,它還能說明事件是如何改變一個類的對象的狀態。
簡單狀態是沒有子結構的狀態。具有子狀態(嵌套狀態)的狀態被稱為複合狀態。子狀態可能被嵌套到任意級別。嵌套的狀態機最多可能有一個初始狀態和一個終止狀態。通過顯示某些狀態只能在特定環境(包含狀態)中存在,子狀態可以簡化複雜的平面狀態機。
轉移的源狀態是包含複合狀態之外的源狀態,其目標狀態可能是複合狀態或子狀態。如果其目標狀態是複合狀態,嵌套的狀態機就必須包括一個初始狀態,在進入複合狀態之後並在發出它的進入操作(如果有)之後,控制權將被傳遞給該初始狀態。如果其目標狀態是嵌套狀態,那嵌套狀態的進入操作(如果有)後,控制權將被傳遞給該嵌套狀態。
從複合狀態出發的轉移可能會以複合狀態或子狀態作為它的源狀態。在這兩種情況下,控制權先離開嵌套狀態(並在可能的情況下發出它的退出操作),然後離開複合狀態(並在可能的情況下發出它的退出操作)。其源狀態為複合狀態的轉移基本上會中斷嵌套狀態機的活動。
順序子狀態
正如名字所暗示的那樣,順序子狀態按照順序一個接著一個出現。重新分析前面提到的子狀態GUI的Working狀態,可以得到以下的狀態序列:
Awaiting user lnput(等待用戶輸入,簡單記為Awaiting狀態)。
Registering User Input(登記用戶輸入,簡單記為Registering狀態)。
Visualizing User Input(顯示用戶輸入,簡單記為Visualizing狀態)。
用戶輸入觸發了從Awaiting狀態到Registering狀態的轉移。Registering狀態內的活動引起了GUI到Visualizing狀態的轉移。在第3個子狀態之後,GUI重新回到Awaiting User Input狀態。右圖表明了在Working狀態中的順序子狀態。
並發子狀態
特徵
處於Working狀態時,GUI並不是僅僅只等待用戶的輸入。它還要監視系統的時鐘,(Watch System Clock)或者(很可能)定期更新應用程式的界面顯示。例如,一個應用程式可能包括一個螢幕時鐘,它的GUI需要定期被更新。
所有這些與前面的順序子狀態的轉移同時進行。儘管每個狀態序列是一組順序子狀態,但是兩個狀態序列之間是並發關係。並髮狀態之間用虛線隔開,表示狀態序列之間是並發關係,如圖所示。
當每個部分體只能屬於一個整體時,這種關係叫組成關係。working狀態和它的兩個並發部分之問也有類似的關係。因此,working的狀態被稱為組成狀態(composite state)。只包順序狀態的狀態也是組成狀態。
狀態圖的作用是標識對象的狀態和行為,以及在對象生命期內在不同的狀態下對象的行為變化。可以將活動對象的狀態細分為並發子狀態,並發子狀態下許多動作可以並發執行。子狀態不必在它們自己的執行緒中執行,雖然常有這種情況。
狀態圖
在狀態圖中,並發子狀態的表示方法是:將狀態框用虛線分隔成一些子區域,每一個子區域表示一個子狀態,每一個子狀態可以有一個可選的狀態名,包含一個嵌套的狀態圖,
也可以用並髮狀態來抽象激活。子狀態顯示當前關心的告警,感測器和單元處理器的動作和狀態。若且唯若所有的子狀態都到達停止狀態時,系統的總狀態才被激活,否則,將系統放在激活失敗狀態。
也可以用複雜的狀態轉移來表示並發。複雜的狀態轉移可以有多個源和目的狀態,可以將控制分成多個並發執行的執行緒或將多個並發執行緒合併成一條執行緒。在這種情況下,狀態圖的一部分可以並發執行。但是,同使用並髮狀態的區別是:複雜狀態轉移中的並髮狀態沒有它們自己的狀態機,它們是並發執行的同一級別上的狀態。
用一條短的垂直的粗線條表示複雜的狀態轉移。可能有一條或多條實心箭頭從某些狀態(稱為源狀態)指向它的狀態轉移線,也可能有一條或多條實心箭頭從狀態轉移線指向某些狀態(稱為目的狀態)。在狀態轉移線的旁邊可以有一個轉移字元串。只有當對象處於某一源狀態且轉移守衛條件為真時,狀態轉移才發生,意味著並發執行開始或結束。
用複雜狀態轉移表示並髮狀態的例子如圖所示。在每一個子區域內的活動並發執行。