一、概念狀態(tài)圖和活動(dòng)圖是狀態(tài)機(jī)的兩種表現(xiàn)形式。
利用狀態(tài)機(jī)可以精確地描述對象的行為。 從對象的初始狀態(tài)起,開始響應(yīng)事件并執(zhí)行某些動(dòng)作,這些事件引起狀態(tài)的轉(zhuǎn)換;對象在新狀態(tài)下又開始響應(yīng)事件和執(zhí)行動(dòng)作,如此連續(xù)進(jìn)行直到終結(jié)狀態(tài)。
二、狀態(tài)圖
狀態(tài)圖(State Diagram)=狀態(tài)(State)+遷移(Transition) <1>狀態(tài)圖的語法除了狀態(tài)中的初始狀態(tài)(實(shí)心圓)和終止?fàn)顟B(tài)(牛眼形狀),其它狀態(tài)用一個(gè)圓角矩形表示 轉(zhuǎn)換表示狀態(tài)間可能的路徑,用箭頭表示 事件/動(dòng)作寫在由它們觸發(fā)引起的轉(zhuǎn)換上

<2>狀態(tài)表示方式:狀態(tài)由一個(gè)帶圓角的矩形表示。

應(yīng)用標(biāo)簽標(biāo)示狀態(tài)的內(nèi)部活動(dòng)。 語法:標(biāo)簽/活動(dòng)表達(dá)式 UML提供的標(biāo)簽: entry:當(dāng)進(jìn)入一個(gè)狀態(tài)的時(shí)候被自動(dòng)觸發(fā),該活動(dòng)在狀態(tài)中其它任何活動(dòng)之前被自動(dòng)觸發(fā)。
do:當(dāng)狀態(tài)處于激活時(shí)執(zhí)行do活動(dòng),do活動(dòng)在進(jìn)入活動(dòng)之后執(zhí)行,并且一直運(yùn)行到它本身完成為止。 exit:當(dāng)離開一個(gè)狀態(tài)的時(shí)候被自動(dòng)觸發(fā),該活動(dòng)在該狀態(tài)結(jié)束之前、所有其它活動(dòng)都完成后被觸發(fā)。
狀態(tài)可以嵌套狀態(tài)圖,此時(shí)狀態(tài)稱為組成狀態(tài),否則為簡單狀態(tài)。 入口事件表示一個(gè)入口的動(dòng)作序列,它在進(jìn)入狀態(tài)時(shí)執(zhí)行。入口事件的動(dòng)作是原子的,并且先于人和內(nèi)部活動(dòng)或轉(zhuǎn)換。 出口事件表示一個(gè)出口的動(dòng)作序列,它在退出狀態(tài)時(shí)執(zhí)行。出口事件也是原子的,它跟在所有的內(nèi)部活動(dòng)之后,但是先于所有的出口轉(zhuǎn)換。
1. 簡單狀態(tài)(Simple State) 
2. 復(fù)合狀態(tài)(Composite State) 
復(fù)合狀態(tài)可以有多組狀態(tài)圖,每組用虛線分割開來。 如果一個(gè)組成狀態(tài)的子狀態(tài)對應(yīng)的對象在其生命期內(nèi)的任何時(shí)刻都只能處于一個(gè)子狀態(tài),即多個(gè)子狀態(tài)之間是互斥的,不能同時(shí)存在,這種子狀態(tài)稱為順序子狀態(tài)。 并發(fā)子狀態(tài)在同一層次給出兩個(gè)或多個(gè)順序子狀態(tài),任何時(shí)刻對象的狀態(tài)是其每個(gè)并發(fā)段中任取一個(gè)狀態(tài)的組合。
并發(fā)狀態(tài)圖由兩個(gè)或多個(gè)并發(fā)子圖組成,每個(gè)子圖叫作一個(gè)并發(fā)段。在任何時(shí)刻,一個(gè)對象的狀態(tài)是每個(gè)并發(fā)段中各取一個(gè)狀態(tài)的組合。當(dāng)對象離開并發(fā)段后,它又恢復(fù)成一個(gè)單一的狀態(tài)。 如果并發(fā)子圖中的一個(gè)狀態(tài)首先完成,它將首先轉(zhuǎn)入下一個(gè)狀態(tài)。但是,如果異常事件發(fā)生,則進(jìn)入唯一的異常狀態(tài)。 當(dāng)一個(gè)對象有幾個(gè)相互獨(dú)立的行為時(shí),并發(fā)狀態(tài)圖可以方便地刻畫它的行為。但一個(gè)對象的并發(fā)行為不應(yīng)太多;如果太多,應(yīng)將其狀態(tài)圖分細(xì)。
并發(fā)區(qū)域(Concurrent Regions) 狀態(tài)圖可以分為區(qū)域,而區(qū)域又包括退出或者當(dāng)前執(zhí)行的子狀態(tài)。說明組合狀態(tài)在某一時(shí)刻可以同時(shí)達(dá)到多個(gè)子狀態(tài)。如下圖剎車系統(tǒng),同時(shí)進(jìn)入前剎車【Applying Front Brakes】狀態(tài)和后剎車【Applying Rear Brakes】狀態(tài)。 
3. 初始狀態(tài)(Initial State) 
4. 終止?fàn)顟B(tài)(Final State) 終止?fàn)顟B(tài)是模型元素的最后狀態(tài),是一個(gè)狀態(tài)圖的終止點(diǎn)。 終止?fàn)顟B(tài)只能作為轉(zhuǎn)換的目標(biāo),而不能作為轉(zhuǎn)換的源。 終止?fàn)顟B(tài)在一個(gè)狀態(tài)圖中可以有多個(gè),它用一個(gè)套有一個(gè)實(shí)心圓的空心圓表示。

5. 結(jié)合狀態(tài)(Junction State)---《暫時(shí)未理解》 將兩個(gè)轉(zhuǎn)換連接成一次就可以完成的轉(zhuǎn)換。
6. 歷史狀態(tài)(History State)
保存組成狀態(tài)中先前被激活的狀態(tài) 
歷史狀態(tài)是一個(gè)偽狀態(tài)(Pseudostate),其目的是記住從組合狀態(tài)中退出時(shí)所處的子狀態(tài),當(dāng)再次進(jìn)入組合狀態(tài),可直接進(jìn)入這個(gè)子狀態(tài),而不是再次從組合狀態(tài)的初態(tài)開始。 
在上圖的狀態(tài)圖中,正常的狀態(tài)順序是:【W(wǎng)ashing】- >【Rinsing】->【Spinning】。 如果是從狀態(tài)【Rinsing】突然停電(Power Cut)退出,,洗衣機(jī)停止工作進(jìn)入狀態(tài)【Power Off】,當(dāng)電力恢復(fù)時(shí)直接進(jìn)入狀態(tài)【Running】。
7.退出節(jié)點(diǎn)(Exit Point)

<3>判定
判定在狀態(tài)圖中的位置:工作流在此處按監(jiān)護(hù)條件的取值而發(fā)生分支。 表示方式:判定用空心小菱形表示。
 <4>遷移/轉(zhuǎn)移(Transitions)轉(zhuǎn)移(Transitions)是兩個(gè)狀態(tài)之間的一種關(guān)系,表示對象將在源狀態(tài)(Source State)中執(zhí)行一定的動(dòng)作,并在某個(gè)特定事件發(fā)生而且某個(gè)特定的警界條件滿足時(shí)進(jìn)入目標(biāo)狀態(tài)(Target State)

事件標(biāo)記(Trigger):是轉(zhuǎn)移的誘因,可以是一個(gè)信號(hào),事件、條件變化(a change in some condition)和時(shí)間表達(dá)式。
警界條件(Guard Condition):當(dāng)警界條件滿足時(shí),事件才會(huì)引發(fā)轉(zhuǎn)移(Transition)。
結(jié)果(Effect):對象狀態(tài)轉(zhuǎn)移后的結(jié)果。 <5>動(dòng)作(State Actions)動(dòng)作(Actions)是一個(gè)可執(zhí)行的原子操作,也就是說動(dòng)作是不可中斷的,其執(zhí)行時(shí)間是可忽略不計(jì)的。 UML提供的三中標(biāo)簽《參考上面》 在上例中,對象狀態(tài)轉(zhuǎn)移后的結(jié)果顯示在轉(zhuǎn)移線上,如果目標(biāo)狀態(tài)有許多轉(zhuǎn)移,而且每個(gè)轉(zhuǎn)移有相同的結(jié)果,這時(shí)把轉(zhuǎn)移后的結(jié)果(Effect)展示在目標(biāo)狀態(tài)中(Target State)更好一些,可以定義進(jìn)入動(dòng)作(Entry Action )和退出動(dòng)作(Exit Action),如下圖

三、活動(dòng)圖
活動(dòng)圖(Activity Diagram)=活動(dòng)(Activity)+動(dòng)作(Action)+活動(dòng)邊(Activity Edge)+活動(dòng)節(jié)點(diǎn)(Activity Node) <1>動(dòng)作狀態(tài)

動(dòng)作狀態(tài)的特點(diǎn):
動(dòng)作狀態(tài)是原子的,它是構(gòu)造活動(dòng)圖的最小單位,已經(jīng)無法分解為更小的部分。 動(dòng)作狀態(tài)是不可中斷的狀態(tài),它一旦開始運(yùn)行就不能中斷,一直運(yùn)行到結(jié)束。 動(dòng)作狀態(tài)是瞬時(shí)的行為,它所占用的處理事件極短,有時(shí)甚至可以忽略。 動(dòng)作狀態(tài)和狀態(tài)圖中的狀態(tài)不同,它不能有入口動(dòng)作和出口動(dòng)作,更不能有內(nèi)部轉(zhuǎn)移。
<2>活動(dòng)狀態(tài)
 活動(dòng)狀態(tài)的特點(diǎn):
活動(dòng)狀態(tài)可以分解成其他子活動(dòng)或動(dòng)作狀態(tài),由于它是一組動(dòng)作或操作的組合,所以可以被中斷。 活動(dòng)狀態(tài)的內(nèi)部活動(dòng)可以用另一個(gè)活動(dòng)圖來表示。 和動(dòng)作狀態(tài)不同,活動(dòng)狀態(tài)可以有入口動(dòng)作和出口動(dòng)作,也可以有內(nèi)部轉(zhuǎn)移。 動(dòng)作狀態(tài)是活動(dòng)狀態(tài)的一個(gè)特例,如果某個(gè)活動(dòng)狀態(tài)只包括一個(gè)動(dòng)作,那么它就是一個(gè)動(dòng)作狀態(tài)。
<3>動(dòng)作流
所有動(dòng)作狀態(tài)之間的轉(zhuǎn)換流稱之為動(dòng)作流,相當(dāng)于狀態(tài)圖中的轉(zhuǎn)換。 與狀態(tài)圖的轉(zhuǎn)換相同,活動(dòng)圖的轉(zhuǎn)換也用帶箭頭的直線表示,箭頭的方向指向轉(zhuǎn)入的方向。 動(dòng)作流可以是無條件的,也可以是有條件的。無條件的動(dòng)作流即是活動(dòng)圖中的普通轉(zhuǎn)換(完成轉(zhuǎn)換,內(nèi)部轉(zhuǎn)換);有條件的動(dòng)作流通過分支與合并來描述。
<4>分支與合并
條件行為用分支和合并表達(dá)。 在活動(dòng)圖中分支與合并用空心小菱形表示。 一個(gè)分支有一個(gè)入轉(zhuǎn)換和兩個(gè)帶條件的出轉(zhuǎn)換,出轉(zhuǎn)換的條件應(yīng)當(dāng)是互斥的,這樣可以保證只有一條出轉(zhuǎn)換能夠被觸發(fā)。 一個(gè)合并有兩個(gè)帶條件的入轉(zhuǎn)換和一個(gè)出轉(zhuǎn)換,合并表示從對應(yīng)的分支開始的條件行為的結(jié)束。

<5>分叉與匯合(并發(fā)與同步)
分叉用于將動(dòng)作流分為兩個(gè)或者多個(gè)并發(fā)運(yùn)行的分支,而匯合則用于同步這些并發(fā)分支,以達(dá)到共同完成一項(xiàng)事務(wù)的目的。 分叉可以用來描述并發(fā)線程,每個(gè)分叉可以有一個(gè)輸入轉(zhuǎn)換和兩個(gè)或多個(gè)輸出轉(zhuǎn)換,每個(gè)轉(zhuǎn)換都可以是獨(dú)立的控制流。 匯合代表兩個(gè)或多個(gè)并發(fā)控制流同步發(fā)生,當(dāng)所有的控制流都達(dá)到匯合點(diǎn)后,控制才能繼續(xù)往下進(jìn)行。每個(gè)匯合可以有兩個(gè)或多個(gè)輸入轉(zhuǎn)換和一個(gè)輸出轉(zhuǎn)換。 分叉和匯合都使用加粗的水平線段表示。


<6>泳道
泳道將活動(dòng)圖中的活動(dòng)化分為若干組,并把每一組指定給負(fù)責(zé)這組活動(dòng)的業(yè)務(wù)組織即對象。 泳道區(qū)分了負(fù)責(zé)活動(dòng)的對象,明確地表示了哪些活動(dòng)是由哪些對象進(jìn)行的。 每個(gè)活動(dòng)只能明確地屬于一個(gè)泳道。 泳道用垂直實(shí)線繪出,垂直線分隔的區(qū)域就是泳道。在泳道上方可以給出泳道的名字或?qū)ο螅▽ο箢悾┑拿郑搶ο螅▽ο箢悾┴?fù)責(zé)泳道內(nèi)的全部活動(dòng)。 泳道沒有順序,不同泳道中的活動(dòng)既可以順序進(jìn)行也可以并發(fā)進(jìn)行,動(dòng)作流和對象流允許穿越分隔線。

<7>對象流對象流是動(dòng)作狀態(tài)或者活動(dòng)狀態(tài)與對象之間的依賴關(guān)系,表示動(dòng)作使用對象或者動(dòng)作對對象的影響。 對象流中的對象特點(diǎn):
一個(gè)對象可以由多個(gè)動(dòng)作操縱。 一個(gè)動(dòng)作輸出的對象可以作為另一個(gè)動(dòng)作輸入的對象。 在活動(dòng)圖中,同一個(gè)對象可以多次出現(xiàn),它的每一次出現(xiàn)表明該對象正處于對象生存期的不同時(shí)間點(diǎn)。
對象流用帶有箭頭的虛線表示。如果箭頭從動(dòng)作狀態(tài)出發(fā)指向?qū)ο螅瑒t表示動(dòng)作對對象施加了一定的影響。如果箭頭從對象指向動(dòng)作狀態(tài),則表示該動(dòng)作使用對象。 
<8>活動(dòng)的分解
一個(gè)活動(dòng)可以分為若干個(gè)動(dòng)作或子活動(dòng),這些動(dòng)作和子活動(dòng)本身可以組成一個(gè)活動(dòng)圖。 一個(gè)包含子活動(dòng)的活動(dòng)和嵌套了子狀態(tài)的組合狀態(tài)類似,概念上也相對統(tǒng)一。 一個(gè)不含內(nèi)嵌活動(dòng)或動(dòng)作的活動(dòng)稱之為簡單活動(dòng);一個(gè)嵌套了若干活動(dòng)或動(dòng)作的活動(dòng)稱之為組合活動(dòng),組合活動(dòng)有自己的名字和相應(yīng)的子活動(dòng)圖。

四、活動(dòng)圖與狀態(tài)圖的區(qū)別
活動(dòng)圖著重表現(xiàn)從一個(gè)活動(dòng)到另一個(gè)活動(dòng)的控制流,是內(nèi)部處理驅(qū)動(dòng)的流程。一般是一個(gè)結(jié)束后,自動(dòng)轉(zhuǎn)入下一個(gè)活動(dòng)。 狀態(tài)圖著重描述從一個(gè)狀態(tài)到另一個(gè)狀態(tài)的流程,主要有外部事件的參與。 活動(dòng)圖是一種特殊的狀態(tài)圖,如果在一個(gè)狀態(tài)圖中的大多數(shù)狀態(tài)是表示操作的活動(dòng),而轉(zhuǎn)移是由狀態(tài)中動(dòng)作的完成來觸發(fā),即全部或絕大多數(shù)的事件是內(nèi)部產(chǎn)生的動(dòng)作完成的,這就是活動(dòng)圖。
五、活動(dòng)圖與流程圖的區(qū)別流程圖著重描述處理過程,它的主要控制結(jié)構(gòu)是順序、分支和循環(huán),各個(gè)處理之間有嚴(yán)格的順序和時(shí)間關(guān)系;而活動(dòng)圖描述的則是對象活動(dòng)的順序關(guān)系所遵循的規(guī)則,它著重表現(xiàn)的是系統(tǒng)的行為,而非系統(tǒng)的處理過程。 活動(dòng)圖能夠表示并發(fā)活動(dòng)的情形,此時(shí)活動(dòng)圖給了我們選擇做事順序的自由,而流程圖對活動(dòng)順序的描述固定。 活動(dòng)圖是面向?qū)ο蟮模鞒虉D是面向過程的。
六、活動(dòng)圖應(yīng)用
活動(dòng)圖的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):最適合支持并行行為,而且也是支持多線程編程的有力工具。 缺點(diǎn):很難清楚地描述動(dòng)作與對象之間的關(guān)系。雖然在活動(dòng)旁標(biāo)出對象名或者采用泳道技術(shù)可以定義這種關(guān)系,但仍然沒有交互圖簡單直接。 因此,像大多數(shù)建模技術(shù)一樣,最好把活動(dòng)圖與其他技術(shù)結(jié)合使用。
1.何時(shí)可使用活動(dòng)圖分析用例。能直觀清晰地分析用例,了解應(yīng)當(dāng)采取哪些動(dòng)作以及這些動(dòng)作之間的依賴關(guān)系。一張完整的活動(dòng)圖是所有用例的集成圖。 理解牽涉多個(gè)用例的工作流。在難于區(qū)分不同用例而對整個(gè)系統(tǒng)的工作過程又十分清楚時(shí),可以先構(gòu)造活動(dòng)圖,然后用切片技術(shù)派生用例圖。 處理多線程應(yīng)用。采用“分層抽象,逐步細(xì)化”的原則描述多線程。
2.何時(shí)不應(yīng)使用活動(dòng)圖顯示對象間的合作。用交互圖顯示對象間的合作更簡單直觀。 顯示對象在生命周期內(nèi)的運(yùn)轉(zhuǎn)情況?;顒?dòng)圖可以表示活動(dòng)的激活條件,但不能表示一個(gè)對象的狀態(tài)變換條件。因此,當(dāng)要描述一個(gè)對象整個(gè)生命周期的運(yùn)轉(zhuǎn)情況時(shí),應(yīng)當(dāng)使用狀態(tài)圖。
3.建模的一般步驟識(shí)別要對其工作流描述的類或?qū)ο蟆?/p> 確定工作流的初始狀態(tài)和終止?fàn)顟B(tài),明確工作流的邊界。 對動(dòng)作狀態(tài)或活動(dòng)狀態(tài)建模。 對動(dòng)作流建模。 對對象流建模。 對建立的模型進(jìn)行精化和細(xì)化。
參考資料: UML建模之狀態(tài)圖(Statechart Diagram)
|