1. 程式人生 > >UML圖詳解(八)狀態機(狀態圖和活動圖)

UML圖詳解(八)狀態機(狀態圖和活動圖)

一、概念

狀態圖和活動圖是狀態機的兩種表現形式。利用狀態機可以精確地描述物件的行為。

從物件的初始狀態起,開始響應事件並執行某些動作,這些事件引起狀態的轉換;物件在新狀態下又開始響應事件和執行動作,如此連續進行直到終結狀態。

二、狀態圖

狀態圖(State Diagram) =狀態(State) + 遷移(Transition)

  • 一個狀態圖描述一個狀態機。
  • 狀態圖表現從一個狀態到另一個狀態的控制流。

2.1 狀態圖的語法

  • 除了狀態中的初始狀態(實心圓)和終止狀態(牛眼形狀),其它狀態用一個圓角矩形表示
  • 轉換表示狀態間可能的路徑,用箭頭表示
  • 事件/動作寫在由它們觸發引起的轉換上

2.2 狀態

  • 狀態一般是給定類物件中的一組屬性值,在其所在的上下文中應該唯一,但可以匿名。
  • 在對系統建模時,我們可以只關心那些明顯影響物件行為的屬性以及由他們表達的物件狀態,而不用理睬那些於物件行為無關的狀態。

表示方式:狀態由一個帶圓角的矩形表示。

應用標籤標示狀態的內部活動。

語法:標籤/活動表示式

UML提供的標籤:

  1. entry:當進入一個狀態的時候被自動觸發,該活動在狀態中其它任何活動之前被自動觸發。
  2. do:當狀態處於啟用時執行do活動,do活動在進入活動之後執行,並且一直執行到它本身完成為止。
  3. exit:當離開一個狀態的時候被自動觸發,該活動在該狀態結束之前、所有其它活動都完成後被觸發。

  狀態可以巢狀狀態圖,此時狀態稱為組成狀態,否則為簡單狀態。
  入口事件表示一個入口的動作序列,它在進入狀態時執行。入口事件的動作是原子的,並且先於人和內部活動或轉換。
  出口事件表示一個出口的動作序列,它在退出狀態時執行。出口事件也是原子的,它跟在所有的內部活動之後,但是先於所有的出口轉換。

1. 簡單狀態(Simple State)

2. 複合狀態(Composite State)

複合狀態可以有多組狀態圖,每組用虛線分割開來。

  • 可以是通過“或”關係分解為互相排斥的順序子狀態
  • 可以是使用“與”關係分解為併發子狀態

  • 如果一個組成狀態的子狀態對應的物件在其生命期內的任何時刻都只能處於一個子狀態,即多個子狀態之間是互斥的,不能同時存在,這種子狀態稱為順序子狀態。

  • 併發子狀態在同一層次給出兩個或多個順序子狀態,任何時刻物件的狀態是其每個併發段中任取一個狀態的組合。

  • 併發狀態圖由兩個或多個併發子圖組成,每個子圖叫作一個併發段。在任何時刻,一個物件的狀態是每個併發段中各取一個狀態的組合。當物件離開併發段後,它又恢復成一個單一的狀態。

  • 如果併發子圖中的一個狀態首先完成,它將首先轉入下一個狀態。但是,如果異常事件發生,則進入唯一的異常狀態。

  • 當一個物件有幾個相互獨立的行為時,併發狀態圖可以方便地刻畫它的行為。但一個物件的併發行為不應太多;如果太多,應將其狀態圖分細。

併發區域(Concurrent Regions)

  狀態圖可以分為區域,而區域又包括退出或者當前執行的子狀態。說明組合狀態在某一時刻可以同時達到多個子狀態。如下圖剎車系統,同時進入前剎車【Applying Front Brakes】狀態和後剎車【Applying Rear Brakes】狀態。

3. 初始狀態(Initial State)

  • 初始狀態代表狀態圖的起始位置,只能作為轉換的源
  • 初始狀態在一個狀態圖中只允許有一個,而不能作為轉換的目標。,它用一個實心的圓表示。

4. 終止狀態(Final State)

  • 終止狀態是模型元素的最後狀態,是一個狀態圖的終止點。
  • 終止狀態只能作為轉換的目標,而不能作為轉換的源。
  • 終止狀態在一個狀態圖中可以有多個,它用一個套有一個實心圓的空心圓表示。

5. 結合狀態(Junction State)—-《暫時未理解》

將兩個轉換連線成一次就可以完成的轉換。

6. 歷史狀態(History State)

儲存組成狀態中先前被啟用的狀態

  • 歷史狀態代表上次離開組成狀態時的最後一個活動子狀態,它用一個包含字母“H”的小圓圈表示。
  • 每當轉換到組成狀態的歷史狀態時,物件便恢復到上次離開該組成狀態時的最後一個活動子狀態,並執行入口動作。

  歷史狀態是一個偽狀態(Pseudostate),其目的是記住從組合狀態中退出時所處的子狀態,當再次進入組合狀態,可直接進入這個子狀態,而不是再次從組合狀態的初態開始。

在上圖的狀態圖中,正常的狀態順序是:【Washing】→【Rinsing】→【Spinning】。
如果是從狀態【Rinsing】突然停電(Power Cut)退出,,洗衣機停止工作進入狀態【Power Off】,當電力恢復時直接進入狀態【Running】。

7.退出節點(Exit Point)

2.3 判定

判定在狀態圖中的位置:工作流在此處按監護條件的取值而發生分支。
表示方式:判定用空心小菱形表示。

2.4 遷移/轉移(Transitions)

  轉移(Transitions)是兩個狀態之間的一種關係,表示物件將在源狀態(Source State)中執行一定的動作,並在某個特定事件發生而且某個特定的警界條件滿足時進入目標狀態(Target State)

事件標記(Trigger):是轉移的誘因,可以是一個訊號,事件、條件變化(a change in some condition)和時間表達式。

警界條件(Guard Condition):當警界條件滿足時,事件才會引發轉移(Transition)。

結果(Effect):物件狀態轉移後的結果。

2.5 動作(State Actions)

  動作(Actions)是一個可執行的原子操作,也就是說動作是不可中斷的,其執行時間是可忽略不計的。UML提供的三中標籤《參考上面》

  在上例中,物件狀態轉移後的結果顯示在轉移線上,如果目標狀態有許多轉移,而且每個轉移有相同的結果,這時把轉移後的結果(Effect)展示在目標狀態中(Target State)更好一些,可以定義進入動作(Entry Action )和退出動作(Exit Action),如下圖

三、活動圖

  活動圖(Activity Diagram) = 活動(Activity) + 動作(Action) + 活動邊(Activity Edge) + 活動節點(Activity Node)

  • 活動圖是狀態機的另一種表現形式。用於為一個物件在其生命週期中的行為建模。
  • 活動圖是一種描述系統動態行為的圖,它用於描述活動的順序,展現從一個活動到另一個活動的控制流。

3.1 動作狀態

  • 動作狀態是指執行原子的、不可中斷的動作,並在此動作完成後通過轉換轉向另一個動作。
  • 動作狀態使用平滑的圓角矩形表示,動作狀態所表示的動作寫在圓角矩形內部。

動作狀態的特點:

  1. 動作狀態是原子的,它是構造活動圖的最小單位,已經無法分解為更小的部分。
  2. 動作狀態是不可中斷的狀態,它一旦開始執行就不能中斷,一直執行到結束。
  3. 動作狀態是瞬時的行為,它所佔用的處理事件極短,有時甚至可以忽略。
  4. 動作狀態和狀態圖中的狀態不同,它不能有入口動作和出口動作,更不能有內部轉移。

3.2 活動狀態

  • 活動狀態用於表達狀態機中的一個非原子的執行。
  • 活動狀態的表示圖示也是平滑的圓角矩形,並可以在圖示中給出入口動作和出口動作等資訊。


活動狀態的特點:

  1. 活動狀態可以分解成其他子活動或動作狀態,由於它是一組動作或操作的組合,所以可以被中斷。
  2. 活動狀態的內部活動可以用另一個活動圖來表示。
  3. 和動作狀態不同,活動狀態可以有入口動作和出口動作,也可以有內部轉移。
  4. 動作狀態是活動狀態的一個特例,如果某個活動狀態只包括一個動作,那麼它就是一個動作狀態。

3.3 動作流

  • 所有動作狀態之間的轉換流稱之為動作流,相當於狀態圖中的轉換。
  • 與狀態圖的轉換相同,活動圖的轉換也用帶箭頭的直線表示,箭頭的方向指向轉入的方向。
  • 動作流可以是無條件的,也可以是有條件的。無條件的動作流即是活動圖中的普通轉換(完成轉換,內部轉換);有條件的動作流通過分支與合併來描述。

3.4 分支與合併

  • 條件行為用分支和合並表達。
  • 在活動圖中分支與合併用空心小菱形表示。
  • 一個分支有一個入轉換和兩個帶條件的出轉換,出轉換的條件應當是互斥的,這樣可以保證只有一條出轉換能夠被觸發。
  • 一個合併有兩個帶條件的入轉換和一個出轉換,合併表示從對應的分支開始的條件行為的結束。

3.5 分叉與匯合(併發與同步)

  1. 分叉用於將動作流分為兩個或者多個併發執行的分支,而匯合則用於同步這些併發分支,以達到共同完成一項事務的目的。
  2. 分叉可以用來描述併發執行緒,每個分叉可以有一個輸入轉換和兩個或多個輸出轉換,每個轉換都可以是獨立的控制流。
  3. 匯合代表兩個或多個併發控制流同步發生,當所有的控制流都達到匯合點後,控制才能繼續往下進行。每個匯合可以有兩個或多個輸入轉換和一個輸出轉換。
  4. 分叉和匯合都使用加粗的水平線段表示。

3.6 泳道

  1. 泳道將活動圖中的活動化分為若干組,並把每一組指定給負責這組活動的業務組織即物件。
  2. 泳道區分了負責活動的物件,明確地表示了哪些活動是由哪些物件進行的。
  3. 每個活動只能明確地屬於一個泳道。
  4. 泳道用垂直實線繪出,垂直線分隔的區域就是泳道。在泳道上方可以給出泳道的名字或物件(物件類)的名字,該物件(物件類)負責泳道內的全部活動。
  5. 泳道沒有順序,不同泳道中的活動既可以順序進行也可以併發進行,動作流和物件流允許穿越分隔線。

3.7 物件流

  物件流是動作狀態或者活動狀態與物件之間的依賴關係,表示動作使用物件或者動作對物件的影響。

物件流中的物件特點:

  1. 一個物件可以由多個動作操縱。
  2. 一個動作輸出的物件可以作為另一個動作輸入的物件。
  3. 在活動圖中,同一個物件可以多次出現,它的每一次出現表明該物件正處於物件生存期的不同時間點。

物件流用帶有箭頭的虛線表示。如果箭頭從動作狀態出發指向物件,則表示動作對物件施加了一定的影響。如果箭頭從物件指向動作狀態,則表示該動作使用物件。

3.8 活動的分解

  1. 一個活動可以分為若干個動作或子活動,這些動作和子活動本身可以組成一個活動圖。
  2. 一個包含子活動的活動和嵌套了子狀態的組合狀態類似,概念上也相對統一。
  3. 一個不含內嵌活動或動作的活動稱之為簡單活動;一個嵌套了若干活動或動作的活動稱之為組合活動,組合活動有自己的名字和相應的子活動圖。

四、活動圖與狀態圖的區別

  1. 活動圖著重表現從一個活動到另一個活動的控制流,是內部處理驅動的流程。一般是一個結束後,自動轉入下一個活動。
  2. 狀態圖著重描述從一個狀態到另一個狀態的流程,主要有外部事件的參與。
  3. 活動圖是一種特殊的狀態圖,如果在一個狀態圖中的大多數狀態是表示操作的活動,而轉移是由狀態中動作的完成來觸發,即全部或絕大多數的事件是內部產生的動作完成的,這就是活動圖。

五、活動圖與流程圖的區別

  1. 流程圖著重描述處理過程,它的主要控制結構是順序、分支和迴圈,各個處理之間有嚴格的順序和時間關係;而活動圖描述的則是物件活動的順序關係所遵循的規則,它著重表現的是系統的行為,而非系統的處理過程。
  2. 活動圖能夠表示併發活動的情形,此時活動圖給了我們選擇做事順序的自由,而流程圖對活動順序的描述固定。
  3. 活動圖是面向物件的,流程圖是面向過程的。

六、活動圖應用

活動圖的優缺點:

  • 優點:最適合支援並行行為,而且也是支援多執行緒程式設計的有力工具。
  • 缺點:很難清楚地描述動作與物件之間的關係。雖然在活動旁標出物件名或者採用泳道技術可以定義這種關係,但仍然沒有互動圖簡單直接。

因此,像大多數建模技術一樣,最好把活動圖與其他技術結合使用。

6.1 何時可使用活動圖

  1. 分析用例。能直觀清晰地分析用例,瞭解應當採取哪些動作以及這些動作之間的依賴關係。一張完整的活動圖是所有用例的整合圖。
  2. 理解牽涉多個用例的工作流。在難於區分不同用例而對整個系統的工作過程又十分清楚時,可以先構造活動圖,然後用切片技術派生用例圖。
  3. 處理多執行緒應用。採用“分層抽象,逐步細化”的原則描述多執行緒。

6.2 何時不應使用活動圖

  1. 顯示物件間的合作。用互動圖顯示物件間的合作更簡單直觀。
  2. 顯示物件在生命週期內的運轉情況。活動圖可以表示活動的啟用條件,但不能表示一個物件的狀態變換條件。因此,當要描述一個物件整個生命週期的運轉情況時,應當使用狀態圖。

6.3 建模的一般步驟

  1. 識別要對其工作流描述的類或物件。
  2. 確定工作流的初始狀態和終止狀態,明確工作流的邊界。
  3. 對動作狀態或活動狀態建模。
  4. 對動作流建模。
  5. 對物件流建模。
  6. 對建立的模型進行精化和細化。