5-行為圖
5.1 活動圖
4.1.1 活動圖的概念
行為系統的動态方面模組化的5個圖之一.它主要是一個流圖,描述從活動到活動的流。
活動是在狀态機中進行的一個非原子的執行,它由一系列的動作組成。
動作是由可執行的不可分的計算組成,這些計算引起系統的狀态發生變化或傳回一個值。
活動圖差別于其它動态模組化圖(非常重要)
- 互動作用圖強調從對象到對象的控制流;
- 時序圖強調消息的時間順序;
- 協作圖強調互動作用的對象的結構關系;
- 互動作用圖着眼于傳遞消息的對象,活動圖則着眼于在對象間傳遞的操作;
- 活動圖根據對象狀态的變化來确定動作與動作的結果。在活動圖中,一個動作結束後自動進入下一個動作;而在狀态圖中,狀态的躍遷可能需要事件的觸發。
組成元素(重要)
- 活動狀态或動作狀态;
- 躍遷;
- 對象;
活動圖與狀态機
活動圖是一種特殊的狀态機,大部分的狀态都是活動狀态,大部分躍遷都是由源狀态活動的完成類觸發的。
活動圖示例
4.1.2 活動圖圖符(重要:區分動作與活動狀态)
- 動作狀态
可執行的、不可分的計算,代表動作的執行.如為屬性指派、調用一個對象的操作、發送一個信号給一個對象等。
動作狀态不能被分解,即事件可以發生,但動作狀态的工作沒有被打斷。
完成動作狀态中的工作花費相當短的執行時間。
- 活動狀态
非原子的,可以分解,可以被打斷,通常需要一段時間才能完成。
動作狀态可看作活動狀态的特例,活動狀态可看作一個組合,由其他活動狀态和動作狀态構成。
活動狀态可以有入口、出口動作和子狀态機的規定。
- 躍遷
用來表示從一個動作或活動狀态傳遞到下一個動作或活動狀态的路徑。
一項操作可以描述為一系列相關活動。一個活動僅一個起始點,但可有多個結束點。
判斷标志可以有多個輸入和輸出躍遷,但在活動的運作中僅觸發一個滿足條件的躍遷。
- 分支
規定了基于布爾表達式的替換路徑。
分支起始于判定,有一個輸入,兩個或多個輸出。每個輸出躍遷上的布爾表達式為真時,躍遷觸發。所有護衛條件不重複,且能覆寫所有的可能性。
分支疊代:用一個活動狀态來設定疊代因子的初始化值,另一個活動狀态來增加疊代因子的值,用一個分支來判斷疊代是否結束。
- 分叉和彙合
UML中使用同步條來規定并行控制流的分叉和聯結。
同步條是一條粗的水準線或垂直線。
分叉表示将單一的控制流分為兩個或多個并發的控制流。分叉有一個輸入躍遷和多個輸出躍遷,每個輸出代表一個獨立的控制流。
在分叉下面,與每個輸出路徑相關的活動是并行進行的。
并發分為真正并發(多CPU)和交叉并發(單CPU)。
代表了兩個或多個并發控制流的同步,聯結有多個輸入躍遷和一個輸出躍遷。
聯結以上,與各路徑有關的活動是并行的。在聯結處,并發的流同步,所有的輸入流到達同步流後,同步條将多個輸入控制流合并,輸出一個控制流,進而執行後面的活動。
分叉和彙合是平衡的,即離開分叉的控制流的數目應該與進入相應彙合的控制流數目相等。并行控制流的活動可以通過發送信号來彼此通信。
- 泳道
泳道說明活動由誰來完成,将活動圖的邏輯描述與順序圖、合作圖的責任描述結合起來。
泳道用矩形框來表示,屬于某個泳道的活動置于該矩形框中,将對象名置于舉行框的頂部,表示泳道中的活動由該對象負責。
前兩活動圖中皆含兩個泳道。
- 對象流
與活動圖有關的控制流可能涉及到對象。可将對象置于活動圖中,用依賴關系将對象和産生、修改或破壞該對象的活動或躍遷連接配接。依賴關系和對象的使用稱為對象流。
活動圖除可說明對象流,還可說明對象的角色、狀态和屬性值的變化。
活動圖示例
畫活動圖的步驟(重要)
- 識别要對其工作流描述的類
- 對動态狀态模組化
- 對動作流模組化
- 對對象流模組化
與流程圖的差別(重要)
- 流程圖着重描述處理過程,而活動圖描述的是對象活動的順序關系所遵循的規則,着重表現的是系統的行為。
- 活動圖能表示并發活動的情形,而流程圖不能。
- 活動圖是面向對象的,而流程圖是面向過程的。
4.1.3 活動圖應用(重要)
- 為工作流模組化
- 為操作模組化
- JAVA代碼模組化
工作流
工作流常用于可視化、規範、建構和文檔化系統的商業過程。
為工作流模組化
- 确定工作流的中心。針對複雜系統模組化。
- 選擇與工作流有關的商業對象。為每個對象建立一個泳道。
- 識别工作流初始狀态的前置條件和工作流最終狀态的後置條件。
- 從工作流的初始狀态開始,規定随時間發生的活動和動作,置于活動圖中。
- 對于複雜動作或多次出現的動作集合,可将它們折疊為活動狀态,再提供一個單獨的活動圖來展開活動狀态。活動圖的粗細粒度
- 用躍遷連接配接活動狀态和動作狀态,從工作流中的順序流開始,後考慮分支,再考慮分叉和聯結。
- 工作流涉及的對象,置于活動圖中。
為操作模組化
- 收集與操作有關的抽象,如參數、傳回值、相關類屬性等。
- 識别工作流初始狀态的前置條件和工作流最終狀态的後置條件,還要識别出在操作執行過程中必須持有的操作所在類的不變量。
- 從工作流的初始狀态開始,規定随時間發生的活動和動作,置于活動圖中。
- 必要時使用分支、分叉和聯結。
為代碼模組化
可用活動圖為每個操作流程模組化,實際中少用,因代碼更易了解。隻有當操作行為複雜,代碼難以閱讀時,才用活動圖為操作模組化。
Java代碼示例
Public void handleThread(int state){
for(int i = ; i < controls.length; i++) {
if(state == CustomControlsContext.START){
if(controls[i].instanceofCustomControls){
((CustomControls)controls[i].start();
}
}else if(state == CustomControlsContext.STOP){
if(controls[i].instanceofCustomControls){
((CustomControls)controls[i].stop();
}
}
}
}
5.2 狀态圖
4.2.1 狀态、躍遷、判定、同步條、活動
狀态(重要:狀态機)
狀态機(State Machine)描述了對象在生命周期中響應事件所經曆的狀态的序列以及對象對這些事件的響應。它由狀态、躍遷、事件、活動、動作等組成。狀态表示對象在生命周期中的一個條件或狀況。
狀态的組成(重要:内部躍遷)
- 名字:用以區分不同的狀态;
- 入口/出口動作:進入和退出狀态時執行動作;
- 内部躍遷:不引起狀态變化的躍遷,不同于自躍遷,不離開狀态,不執行出口和入口動作;
- 子狀态:被嵌套的狀态,包括不相交子狀态和并發子狀态;’
- 不含子結構的狀态稱為簡單狀态(Simple State),含子狀态的狀态稱為組合狀态(Composite State)。
- 不相交子狀态:也稱為順序子狀态(Sequential Substates)。
-
延遲事件(Deferred Events):在目前狀态不處理,推遲到不再被推遲時處理,它的實作需要存在一個内部的事件隊列。通過将事件與defer綁定來延遲事件。
7.初始狀态(Initial State)和最終狀态(Final State)兩種特殊的狀态,表示狀态機的開始和結束。
順序子狀态
組合狀态Purchasing中的子狀态
曆史狀态
曆史狀态使得含有順序子狀态的組合狀态能記住離開給組合狀态前的最後一個活動子狀态,用帶圈的“H”表示。
如子狀态進入最終狀态,它丢失它存儲的曆史,就好象狀态機一次也未進入一樣。
并發子狀态
躍遷(重要)
兩個狀态間的一種關系。對象在一種狀态執行動作、發生事件或滿足條件時,跳轉到另一狀态。它是從活動(或動作)到活動(或動作)的控制流的傳遞。
躍遷分為内部躍遷和外部躍遷,外部躍遷是最為普通的躍遷,會發生狀态的變化,内部躍遷不會發生狀态的變化.
躍遷的組成
- 源狀态與目标狀态:躍遷觸發前,對象處于源狀态,觸發後對象處于目标狀态。
- 觸發事件:事件是可以觸發狀态躍遷的激勵的發生。躍遷圖中的addStudent就是觸發事件。完成躍遷(活動結束)屬于非觸發躍遷。源狀态與目标狀态相同的躍遷是自躍遷。躍遷可以有多個源狀态或目标狀态。
- 護衛條件:一個布爾表達式,用“[]”括起,放在觸發時間後面,當觸發事件後判斷表達式為“真”執行躍遷,否則不執行。
- 動作:一個可執行的原子計算。它可以包括方法的調用、另一個對象的建立或銷毀、給對象發送一個信号等動作。躍遷圖中的sum=sum+1就是動作。動作是原子的,完成前不能被打斷,這點不同于活動。
判定(Decision)
代表活動圖或狀态圖的一個特殊位置,工作流在這個問題根據護衛條件分支。
同步條(Synchronization Bars)
定義活動圖中的分叉(Forks)和聯結(Joins)。
活動(Activity)
活動是狀态機中進行的一個非原子的執行,由一系列的動作組成。可以将動作看作是特殊的活動,即不能再細分的活動。
4.2.2 狀态圖
為系統的動态方面模組化的5個圖之一。它主要是一個流圖,描述從狀态到狀态的流,包括一個特定對象的所有可能狀态以及引起狀态躍遷的事件。活動圖是狀态圖的特例。
狀态圖是為一個對象的生命期間的情況建立模型,着重描述從一個狀态到另一個狀态的流程,主要是外部事件的參與。
相關概念
- 狀态圖:給出一狀态機,強調從狀态到狀态的控制流;
- 狀态機:規定對象在生命周期中響應事件所經曆的狀态的序列以及對象對這些事件的響應;
- 狀态:對象在生命周期中的一種條件或狀況;
- 事件:重要發生事件的規範,在時空域中有一個位置;
- 躍遷:兩個狀态間的關系;
- 活動:狀态機中正在執行的可分的執行;
- 動作:可執行的、不可分的計算;
畫圖步驟
- 識别一個對其生命周期進行描述的參與行為的類
- 對對象模組化,即确定對象可能存在的狀态
- 對事件模組化,即确定對象可能存在的事件
- 對動作模組化,即确定當轉變被激活是,相應被執行的動作
狀态
- 初始狀态(1個)
- 最終狀态(1個或多個)
- 中間狀态
- 複合狀态
躍遷
帶箭頭的連線,連接配接不同狀态。躍遷由事件觸發,應在其上标出事件表達式。無事件表達式表示源狀态内部活動完成後自動觸發躍遷
與其他圖差別(重要)
- 互動作用圖描述多個對象間的互動作用;
- 活動圖描述從活動到活動的控制流;
- 狀态圖描述單個對象在它的整個生命周期的行為,為從事件到事件的控制流。
狀态圖示例
機房收費系統登入的狀态圖
4.2.3 狀态圖應用
通常用來描述事件驅動對象的行為。主要規定對象穩定狀态、躍遷觸發事件、狀态變化發生的動作。
為事件驅動對象模組化
- 選擇狀态機的上下文,上下文可以是一個類、用例、子系統或系統整體;
- 為對象選擇初始狀态和最終狀态;
- 考慮對象存在一段時間的條件,确定對象的穩定狀态;
- 确定穩定狀态在對象生命周期中的局部排序;
- 确定觸發從狀态到狀态躍遷的事件;
- 确定狀态變化的動作;
- 通過使用子狀态、分支、曆史狀态等來簡化狀态機;
- 确定是否所有的狀态都在事件的某個組合中可達;
- 确定沒有狀态是死端,死端即沒有事件組合可以使對象從這個狀态中躍出;
- 檢查狀态機是否違反預想的事件順序和響應。
示例
Java代碼與對應狀态圖
int sum = ;
public int register(Student s){
switch(state){
case Open:
if(sum > ){
state = Open;
sum = sum + ;
}else
state = Close;
break;
case Close:
System.out.println(“the class is full”);
}
return sum;
}
活動圖随堂測試
仔細分析下面對某公司“會見顧客”業務流程的描述,畫出帶泳道的活動圖。
(1)公司業務員打電話給客戶,确定一個會面。
(2)如果會面地點在公司内,公司技術人員需要為會面準備一間會議室,同時,咨詢顧問需要為準備一份陳述報告。
(3)如果會面地點在公司外,則隻需咨詢顧問需要為準備一份陳述報告。
(4)咨詢顧問與顧客在約定的時間和地點見面。
(5)業務員随後為他們準備好會議用紙。
(6)如果會面得到了一個解決方案,則咨詢顧問根據解決方案編寫一個報告,并将報告發給顧客。