複製鏈接
請複製以下鏈接發送給好友

子狀態

鎖定
子狀態(substate),又稱嵌套狀態,指出現在另一個狀態裏面的狀態,一系列子狀態的集合狀態,把一個狀態畫在另一個狀態中表示內部的狀態是一個外部狀態的子狀態。而這個外部狀態即為內部狀態的父狀態。
子狀態以兩種形式出現:順序子狀態(sequential substate)和併發子狀態(concurrent substate)。
中文名
子狀態
外文名
substate
應用領域
計算機等
出現形式
順序子狀態和併發子狀態
實    質
單個狀態的變化
分    類
與子狀態、或子狀態

子狀態簡介

圖5.14 圖5.14
狀態可能有嵌套的子狀態,且子狀態可以在另一個狀態圖。子狀態又可分為兩種:與子狀態(and-substate),或子狀態(or-substate)。與子狀態指的是一個狀態可以有子狀態,但是一次只能有一個子狀態,如圖5.14所示。例如,一輛車可以處於運行態,它的運行態可以有兩個子狀態:前進和後退,它們是或子狀態,因為它們不能同時為真。嵌套的子狀態可以顯示在另一個狀態圖中,方法是在初始狀態圖中擴展運行狀態。
另一方面,運行態可能有多個並行的子狀態(與子狀態):前進和低速,前進和高速,後退和低速,後退和高速。當一個狀態有與子狀態且它們中的幾個可以同時為真時,表示一個狀態既有與子狀態也有或子狀態。與子狀態也稱作並行狀態,可以用來抽象並行線程的狀態。

子狀態狀態圖

狀態圖主要用來描述對象、子系統、系統的生命週期。通過狀態圖可以瞭解到一個對象所能到達的所有狀態以及對象收到的事件(收到消息,超時,錯誤,條件滿足)對對象狀態的影響等。所有的類,只要它有可標記的狀態和複雜的行為,都應該有一個狀態圖。狀態圖指定對象的 [1]  行為以及根據不同的當前狀態行為之間的差別。同時,它還能説明事件是如何改變一個類的對象的狀態。
簡單狀態是沒有子結構的狀態。具有子狀態(嵌套狀態)的狀態被稱為複合狀態。子狀態可能被嵌套到任意級別。嵌套的狀態機最多可能有一個初始狀態和一個終止狀態。通過顯示某些狀態只能在特定環境(包含狀態)中存在,子狀態可以簡化複雜的平面狀態機。
轉移的源狀態是包含複合狀態之外的源狀態,其目標狀態可能是複合狀態或子狀態。如果其目標狀態是複合狀態,嵌套的狀態機就必須包括一個初始狀態,在進入複合狀態之後並在發出它的進入操作(如果有)之後,控制權將被傳遞給該初始狀態。如果其目標狀態是嵌套狀態,那嵌套狀態的進入操作(如果有)後,控制權將被傳遞給該嵌套狀態。
從複合狀態出發的轉移可能會以複合狀態或子狀態作為它的源狀態。在這兩種情況下,控制權先離開嵌套狀態(並在可能的情況下發出它的退出操作),然後離開復合狀態(並在可能的情況下發出它的退出操作)。其源狀態為複合狀態的轉移基本上會中斷嵌套狀態機的活動。

子狀態順序子狀態

正如名字所暗示的那樣,順序子狀態按照順序一個接着一個出現。重新分析前面提到的子狀態GUI的Working狀態,可以得到以下的狀態序列: [2] 
Awaiting user lnput(等待用户輸入,簡單記為Awaiting狀態)。
Registering User Input(登記用户輸入,簡單記為Registering狀態)。
Visualizing User Input(顯示用户輸入,簡單記為Visualizing狀態)。
圖1 圖1
用户輸入觸發了從Awaiting狀態到Registering狀態的轉移。Registering狀態內的活動引起了GUI到Visualizing狀態的轉移。在第3個子狀態之後,GUI重新回到Awaiting User Input狀態。圖1表明了在Working狀態中的順序子狀態。

子狀態併發子狀態

子狀態特徵

處於Working狀態時,GUI並不是僅僅只等待用户的輸入。它還要監視系統的時鐘,(Watch System Clock)或者(很可能)定期更新應用程序的界面顯示。例如,一個應用程序可能包括一個屏幕時鐘,它的GUI需要定期被更新。 [2] 
圖2 圖2
所有這些與前面的順序子狀態的轉移同時進行。儘管每個狀態序列是一組順序子狀態,但是兩個狀態序列之間是併發關係。併發狀態之間用虛線隔開,表示狀態序列之間是併發關係,如圖2所示。
當每個部分體只能屬於一個整體時,這種關係叫組成關係。working狀態和它的兩個併發部分之問也有類似的關係。因此,working的狀態被稱為組成狀態(composite state)。只包順序狀態的狀態也是組成狀態。
狀態圖的作用是標識對象的狀態和行為,以及在對象生命期內在不同的狀態下對象的行為變化。可以將活動對象的狀態細分為併發子狀態,併發子狀態下許多動作可以併發執行。子狀態不必在它們自己的線程中執行,雖然常有這種情況。

子狀態狀態圖

在狀態圖中,併發子狀態的表示方法是:將狀態框用虛線分隔成一些子區域,每一個子區域表示一個子狀態,每一個子狀態可以有一個可選的狀態名,包含一個嵌套的狀態圖,
圖3 圖3
也可以用併發狀態來抽象激活。子狀態顯示當前關心的告警,傳感器和單元處理器的動作和狀態。當且僅當所有的子狀態都到達停止狀態時,系統的總狀態才被激活,否則,將系統放在激活失敗狀態。
也可以用複雜的狀態轉移來表示併發。複雜的狀態轉移可以有多個源和目的狀態,可以將控制分成多個併發執行的線程或將多個併發線程合併成一條線程。在這種情況下,狀態圖的一部分可以併發執行。但是,同使用併發狀態的區別是:複雜狀態轉移中的併發狀態沒有它們自己的狀態機,它們是併發執行的同一級別上的狀態。
用一條短的垂直的粗線條表示複雜的狀態轉移。可能有一條或多條實心箭頭從某些狀態(稱為源狀態)指向它的狀態轉移線,也可能有一條或多條實心箭頭從狀態轉移線指向某些狀態(稱為目的狀態)。在狀態轉移線的旁邊可以有一個轉移字符串。只有當對象處於某一源狀態且轉移守衞條件為真時,狀態轉移才發生,意味着併發執行開始或結束。
用複雜狀態轉移表示併發狀態的例子如圖3所示。在每一個子區域內的活動併發執行。 [1] 
參考資料
  • 1.    蔣慧.時代新潮流UML ProgrammingGuide設計核心技術:北京希望電子出版社,2005: 89
  • 2.    施穆勒.UML基礎、案例與應用(第三版):人民郵電出版社,2004:84