今天,繼續(xù)我們的UML之旅。
今天,我們將瀏覽一下UML中的狀態(tài)機(jī)圖。
狀態(tài)機(jī)圖(State Machine Diagram)是系統(tǒng)分析中常用的一種工具,它用于描述一個(gè)對(duì)象在其生命周期內(nèi)所經(jīng)歷的各種狀態(tài),以及狀態(tài)之間的轉(zhuǎn)移、引發(fā)轉(zhuǎn)移的事件或狀態(tài)轉(zhuǎn)移的活動(dòng)。
狀態(tài)機(jī)圖主要用于對(duì)類或?qū)ο蟮膭?dòng)態(tài)行為進(jìn)行建模。也可以對(duì)一個(gè)用例,或整個(gè)系統(tǒng)進(jìn)行建模。
狀態(tài)機(jī)由狀態(tài)、轉(zhuǎn)移、事件和動(dòng)作等組成。
狀態(tài)(state)是指對(duì)象在其生命周期中,滿足某些條件、執(zhí)行某些活動(dòng)或等待某些事件時(shí)的一個(gè)狀況。
如圖書館的一本書籍可能有:“在架”、“借出”、“被預(yù)借”等狀態(tài);讀者可能有“已綁定借閱卡”、“未綁定借閱卡”、“被限制借閱”等狀態(tài)。
在UML中,狀態(tài)使用圓角矩形表示,一個(gè)狀態(tài)有自己的狀態(tài)名稱,狀態(tài)中包含該狀態(tài)下將執(zhí)行的動(dòng)作和事件。
圖1 借閱圖書狀態(tài)
如上圖是借閱系統(tǒng)中借閱圖書的一個(gè)狀態(tài)。
entry、do和exit是標(biāo)準(zhǔn)的三個(gè)動(dòng)作,分別是進(jìn)入狀態(tài)時(shí)的動(dòng)作,處于該狀態(tài)下執(zhí)行的動(dòng)作和退出該狀態(tài)時(shí)的動(dòng)作。
且可以在該狀態(tài)下定義相應(yīng)的事件動(dòng)作event。
entry為進(jìn)入動(dòng)作,當(dāng)進(jìn)入該狀態(tài)時(shí)要執(zhí)行的動(dòng)作;
exit為退出動(dòng)作,當(dāng)離開當(dāng)前狀態(tài)時(shí)要執(zhí)行的動(dòng)作。
除了這種標(biāo)準(zhǔn)狀態(tài)之外,UML中還定義了初始狀態(tài)、結(jié)束狀態(tài)、組合狀態(tài)、子狀態(tài)和歷史狀態(tài)。
(1)初始狀態(tài)
初始狀態(tài)代表狀態(tài)機(jī)圖的開始,使用實(shí)心圓表示。一個(gè)狀態(tài)機(jī)圖只有一個(gè)初始狀態(tài)。
圖2 初始狀態(tài)
(2)結(jié)束狀態(tài)
結(jié)束狀態(tài)表示一個(gè)狀態(tài)機(jī)圖的結(jié)束,使用實(shí)心的圓環(huán)表示。一個(gè)狀態(tài)機(jī)圖可以有多個(gè)結(jié)束狀態(tài)。
圖3 結(jié)束狀態(tài)
(3)組合狀態(tài)
組合狀態(tài)是狀態(tài)內(nèi)部嵌套有子狀態(tài)的狀態(tài)。一個(gè)組合狀態(tài)包含一系列子狀態(tài)。
而沒有嵌套的狀態(tài)稱之為簡(jiǎn)單狀態(tài)。
嵌套在一個(gè)狀態(tài)內(nèi)部的狀態(tài)為子狀態(tài)。可以根據(jù)狀態(tài)是否同時(shí)存在,可以再細(xì)分為順序子狀態(tài)和并發(fā)子狀態(tài)。
順序子狀態(tài):在組合狀態(tài)的生命周期中,任何時(shí)刻只能處于一個(gè)子狀態(tài),即多個(gè)子狀態(tài)之間是互斥的關(guān)系,不能同時(shí)存在。
如下面的圖中演示一部手機(jī)處于“給某人打電話”這種組合狀態(tài)時(shí),其子狀態(tài)不能同時(shí)存在,是一種順序的子狀態(tài)。
圖4 組合狀態(tài)之順序子狀態(tài)
并發(fā)子狀態(tài):多個(gè)順序的子狀態(tài)可以同時(shí)存在。下圖給出一輛汽車行駛中的組合狀態(tài)。低速和高速這兩個(gè)狀態(tài)是順序的子狀態(tài),在某一時(shí)刻只能處于其中一個(gè)狀態(tài);前進(jìn)和倒車也是如此。但這兩個(gè)順序的子狀態(tài)又可以同時(shí)存在。
圖5 組合狀態(tài)之并發(fā)子狀態(tài)
歷史狀態(tài):歷史狀態(tài)是一種偽狀態(tài),它表示在狀態(tài)再次轉(zhuǎn)移到該組合狀態(tài)時(shí),應(yīng)處于上一次退出時(shí)的一個(gè)子狀態(tài)。
圖6 組合狀態(tài)之歷史狀態(tài)
上圖給出了一個(gè)音樂(lè)播放器的一個(gè)狀態(tài)機(jī)圖。其中“播放”標(biāo)記為歷史狀態(tài)。其含義是在播放狀態(tài)轉(zhuǎn)移到暫停狀態(tài),當(dāng)由暫停再進(jìn)入播放狀態(tài)時(shí),其應(yīng)進(jìn)入“播放”狀態(tài)退出時(shí)的一個(gè)子狀態(tài),它可能在退出時(shí)是“順序播放”狀態(tài),也可能是“隨機(jī)播放”狀態(tài),也可能是“倒序播放”狀態(tài),但必須是退出“播放”狀態(tài)時(shí)所處的一個(gè)歷史狀態(tài)。
轉(zhuǎn)移(Transition)指的是兩個(gè)不同狀態(tài)之間的一種關(guān)系,是對(duì)象在滿足一定條件或發(fā)生某個(gè)事件時(shí),從一種狀態(tài)遷移到另外一種狀態(tài)。
圖7 狀態(tài)轉(zhuǎn)移
一個(gè)轉(zhuǎn)移一般包括源狀態(tài)、目的狀態(tài)、觸發(fā)事件、警戒條件和動(dòng)作5部分組成。
也就是說(shuō)事件的發(fā)生導(dǎo)致了從源狀態(tài)到目的狀態(tài)的轉(zhuǎn)移。
(1)源狀態(tài)
是受轉(zhuǎn)移影響的狀態(tài),當(dāng)事件發(fā)生或滿足警戒條件時(shí),就會(huì)激活一個(gè)轉(zhuǎn)移。
(2)目的狀態(tài)
轉(zhuǎn)移完成后的狀態(tài)。
(3)觸發(fā)事件
當(dāng)源狀態(tài)的對(duì)象接收到事件時(shí)轉(zhuǎn)移才有可能被激活。觸發(fā)事件有自己的名稱,也可以有自己的參數(shù)。
(4)警戒條件
轉(zhuǎn)移激活前需要滿足的一個(gè)條件。警戒條件往往是一個(gè)邏輯表達(dá)式,其值為真或假。觸發(fā)事件發(fā)生,且警戒條件為真時(shí),轉(zhuǎn)移才會(huì)被激活。否則,本次事件將被丟棄,只能等待下一次觸發(fā)事件的發(fā)生。
(5)動(dòng)作
當(dāng)轉(zhuǎn)移被激活時(shí),對(duì)應(yīng)的動(dòng)作也會(huì)被執(zhí)行。動(dòng)作一般可以是一個(gè)賦值操作或算術(shù)運(yùn)算,也可以是調(diào)用目的對(duì)象的一個(gè)操作或創(chuàng)建、銷毀一個(gè)對(duì)象,也可以是用簡(jiǎn)單語(yǔ)言來(lái)說(shuō)明動(dòng)作的含義。
圖8 動(dòng)作
上圖中是圖書由“在架”狀態(tài)轉(zhuǎn)移到“被預(yù)借”狀態(tài)的一個(gè)例子。
源狀態(tài)是“在架”,目的狀態(tài)是“被預(yù)借”,“讀者預(yù)借”是觸發(fā)事件的名稱,“圖書編號(hào)”是觸發(fā)事件的參數(shù),“讀者預(yù)借數(shù)量<=1”是轉(zhuǎn)移的警戒條件,“添加預(yù)借記錄”和“設(shè)置圖書預(yù)借標(biāo)志=1”是轉(zhuǎn)移伴隨的動(dòng)作。
轉(zhuǎn)移還區(qū)分外部轉(zhuǎn)移和內(nèi)部轉(zhuǎn)移兩種情形。
外部轉(zhuǎn)移:外部轉(zhuǎn)移是一種改變狀態(tài)的轉(zhuǎn)移。也是狀態(tài)機(jī)中常見的一種轉(zhuǎn)移。
這種轉(zhuǎn)移主要出現(xiàn)在兩個(gè)不同的狀態(tài)之間。
內(nèi)部轉(zhuǎn)移:內(nèi)部轉(zhuǎn)移是指不會(huì)導(dǎo)致狀態(tài)改變的轉(zhuǎn)換。有時(shí),我們需要在該狀態(tài)下處理一些無(wú)需離開狀態(tài)的事件,這時(shí)可以定義一個(gè)內(nèi)部轉(zhuǎn)移。
如“借閱圖書”這個(gè)狀態(tài)中,“超出借閱冊(cè)數(shù)”時(shí),我們可能終止該本書的借閱,不把本書添加到借閱列表中,這種處理沒有導(dǎo)致借閱圖書狀態(tài)的轉(zhuǎn)移,可以視為內(nèi)部轉(zhuǎn)移。
內(nèi)部轉(zhuǎn)移的表示方法:
事件(參數(shù)名)[警戒條件]/動(dòng)作
如下圖所示的三個(gè)event動(dòng)作。
圖9 借閱圖書的狀態(tài)動(dòng)作
如果源狀態(tài)與目的狀態(tài)是同一狀態(tài),則稱為自轉(zhuǎn)移。
下面這個(gè)例子中的“循環(huán)”就是一個(gè)自轉(zhuǎn)移的例子。
圖10 自轉(zhuǎn)移
事件(Event)是指在特定時(shí)間或空間內(nèi)出現(xiàn),并能夠?qū)е聽顟B(tài)轉(zhuǎn)移的信號(hào)、超時(shí)、條件改變、時(shí)間段等。
主要包括信號(hào)事件、時(shí)間事件、改變事件和調(diào)用事件等。
(1)信號(hào)事件
信號(hào)事件(signal event)是指一個(gè)對(duì)象接收到信號(hào)的事件,該接收信號(hào)的事件會(huì)導(dǎo)致其狀態(tài)的轉(zhuǎn)換。
發(fā)送對(duì)象明確地創(chuàng)建、初始化一個(gè)信號(hào)實(shí)例并把它發(fā)送到一個(gè)對(duì)象或?qū)ο蟮募稀?/p>
圖11 在選擇記錄時(shí),按下ctrl進(jìn)入多選模式狀態(tài),釋放ctrl鍵轉(zhuǎn)換為單選模式
(2)時(shí)間事件
時(shí)間事件(time event)代表時(shí)間的流逝。當(dāng)時(shí)間條件被滿足時(shí)可能要觸發(fā)某個(gè)事件。時(shí)間可以是相對(duì)的也可以絕對(duì)的。如:after(9:00)。
圖12 在路燈控制系統(tǒng)中,上午6:00斷電關(guān)閉,下午18:00后供電,開燈
(3)改變事件
改變事件(change event)是指依賴特定屬性值的邏輯表達(dá)式所表示的條件滿足時(shí),事件發(fā)生。
這里的改變事件與上面所說(shuō)的警戒條件不同,警戒條件是在轉(zhuǎn)移事件發(fā)生時(shí)或事件接收者對(duì)事件處理時(shí)被賦值一次,如果警戒條件為假,則轉(zhuǎn)移就不會(huì)發(fā)生,且該事件會(huì)被丟棄,警戒條件也不會(huì)再給賦值;而改變事件會(huì)被多次賦值直到條件為真,從而激活轉(zhuǎn)移。可以使用when(exp)的形式來(lái)表示。
圖13 登錄后,time自動(dòng)連續(xù)增加,未操作時(shí)間超過(guò)300秒取消登錄狀態(tài)
(4)調(diào)用事件
調(diào)用事件(call event)表示一個(gè)對(duì)象接收到一個(gè)對(duì)調(diào)用的請(qǐng)求,這個(gè)對(duì)象用狀態(tài)的轉(zhuǎn)移而非特定的處理過(guò)程來(lái)實(shí)現(xiàn)操作。操作的參數(shù)即是事件的參數(shù)。調(diào)用結(jié)束時(shí),被調(diào)用者將返回結(jié)果給調(diào)用者,調(diào)用者可以繼續(xù)執(zhí)行。
圖14 借閱圖書狀態(tài)中如有未交清罰款進(jìn)入到繳納罰款狀態(tài),繳納罰款完畢后返回繳清標(biāo)志,借閱圖書狀態(tài)繼續(xù)保持
動(dòng)作通常是一個(gè)簡(jiǎn)短的計(jì)算處理過(guò)程,如賦值操作或算術(shù)運(yùn)算。動(dòng)作也可以是一個(gè)動(dòng)作序列,包括給另外一個(gè)對(duì)象發(fā)送消息、調(diào)用一個(gè)操作、設(shè)置返回值、創(chuàng)建或銷毀對(duì)象。
動(dòng)作具有原子性,所以動(dòng)作不可被中斷,不能被同時(shí)發(fā)生的其它動(dòng)作所影響或終止。
動(dòng)作運(yùn)行時(shí)間很短,不能再被插入其它事件。
各種動(dòng)作的種類及相關(guān)語(yǔ)法可描述如下:
(1)賦值:target:=expression
(2)調(diào)用:opname(arg1,arg2)
(3)創(chuàng)建對(duì)象:new Cname(arg1,arg2)
(4)銷毀對(duì)象:object.destroy()
(5)返回值:return value
(6)向?qū)ο蟀l(fā)送消息:sname(arg1,arg2)
(7)對(duì)象自我終止:terminate
(8)不可中斷動(dòng)作:[用語(yǔ)言說(shuō)明]
在狀態(tài)圖建模過(guò)程中可以參考以下步驟:
(1)確定建模的語(yǔ)境
狀態(tài)機(jī)可以用于對(duì)類進(jìn)行建模,也可以為一個(gè)用例進(jìn)行建模或者為一個(gè)子系統(tǒng),甚至整個(gè)系統(tǒng)建模。我們可以遵循從小到大的原則進(jìn)行建模,從類的狀態(tài)到用例,再到子系統(tǒng)的過(guò)程。當(dāng)然,并不是每個(gè)類都需要建立狀態(tài)機(jī)。
(2)識(shí)別狀態(tài)
確定好建模的語(yǔ)境后,識(shí)別其可能的狀態(tài),識(shí)別狀態(tài)可以按照從粗到細(xì)的方法去識(shí)別。并確定出必要的狀態(tài)。
(3)確定狀態(tài)的進(jìn)入動(dòng)作和退出動(dòng)作
對(duì)每個(gè)狀態(tài)確定其是否需要進(jìn)入動(dòng)作和退出動(dòng)作。
(4)確定狀態(tài)中的其它動(dòng)作
確定建模對(duì)象在該狀態(tài)下是否有其他需要做的事情以及警戒條件等。
(5)確定狀態(tài)之間的轉(zhuǎn)移
識(shí)別出各個(gè)狀態(tài)之間轉(zhuǎn)移的條件或事件,以及警戒條件等。
(6)檢查所繪制的狀態(tài)機(jī)是否與實(shí)際相符
(7)進(jìn)行必要的優(yōu)化
優(yōu)化包括圖形的布局,圖形的形式,以及狀態(tài)是否有冗余等。
在Rose中,可以為一個(gè)類、一個(gè)用例或一個(gè)參與者建立狀態(tài)圖,也可以為一個(gè)子系統(tǒng)或整個(gè)系統(tǒng)建立狀態(tài)圖。
在Rose中,狀態(tài)圖可以創(chuàng)建在用例視圖或邏輯視圖里。
如果為某一個(gè)對(duì)象,如類、用例或參與者,可以直接在左側(cè)對(duì)象瀏覽器中的該對(duì)象上右擊,然后選擇“New”(新建)->"Statechart Diagram"(狀態(tài)圖)。
圖15 為一個(gè)對(duì)象建立狀態(tài)圖
若不指定對(duì)象,也可以在邏輯視圖或用例視圖上右擊選擇“New”->“Statechart Diagram”。
圖16 在邏輯視圖上新建狀態(tài)圖
新建完?duì)顟B(tài)圖后,可以直接給其重新命名。或者通過(guò)右擊新建的狀態(tài)圖,然后選擇“rename”,如下圖所示:
圖17 為狀態(tài)圖重命名
通過(guò)在左側(cè)對(duì)象瀏覽器中,雙擊新建的狀態(tài)圖可以開始工作了。
同時(shí),在中間顯示出用于狀態(tài)圖的工具箱,默認(rèn)的工具箱及其含義如下:
圖18 狀態(tài)圖工具箱
用戶也可以在工具箱上右擊后選擇“Customize...”來(lái)添加其它的工具,如下圖所示:
圖19 自定義工具箱
用戶可以在左側(cè)選中一個(gè)工具,然后點(diǎn)擊“添加(A)->”,將其添加到工具欄中,也可以把不需要的工具在右側(cè)選中之后點(diǎn)擊“<-刪除(R)”將其刪除掉。
在左側(cè)待選工具中,“—”是用于創(chuàng)建一個(gè)水平的同步條,“|”用于創(chuàng)建一個(gè)垂直的同步條,“◇”用于創(chuàng)建一個(gè)判定。
定制好自己的工具箱后,可以點(diǎn)擊“關(guān)閉”按鈕將其關(guān)閉。
(1)創(chuàng)建
用戶在工具箱中點(diǎn)擊狀態(tài)工具,然后在右側(cè)工作區(qū)中點(diǎn)擊一下,就會(huì)創(chuàng)建一個(gè)狀態(tài)。
(2)修改名稱
方式一:創(chuàng)建完?duì)顟B(tài),其默認(rèn)名稱會(huì)默認(rèn)被選中,這時(shí),用戶可以直接修改其名稱;
方式二:在創(chuàng)建完以后要修改其名稱,可以先選中這個(gè)狀態(tài),然后再次點(diǎn)擊一下,也可以修改其名稱;
方式三:在狀態(tài)上雙擊,彈出如下對(duì)話框:
圖20 狀態(tài)圖規(guī)范說(shuō)明對(duì)話框
在其“General”(通用)選項(xiàng)卡上的Name(名稱)項(xiàng)中修改其名稱;
方式四:右擊該狀態(tài),然后選擇“Open Specification...”,也會(huì)彈出上圖所示的對(duì)話框。右擊狀態(tài)選擇的情形如下圖所示:
圖21 右擊狀態(tài)圖選擇“打開規(guī)范說(shuō)明...”
(3)刪除一個(gè)狀態(tài)
如果想徹底刪除一個(gè)狀態(tài),可以選中狀態(tài)后,按下“Ctrl + D”,這樣就把這個(gè)狀態(tài)徹底從模型庫(kù)中刪除了。
也可以在狀態(tài)上右擊,然后選擇“Edit”(編輯),再選擇“Delete from Model”,也可以把這個(gè)狀態(tài)從模型庫(kù)中徹底刪除。
用戶還可以在選中狀態(tài)后,通過(guò)菜單中的“Edit”菜單下的“Delete from Model”從模型庫(kù)中刪除該狀態(tài)。
圖22 右擊選擇刪除狀態(tài)
如果僅是從當(dāng)前圖中刪除狀態(tài),而非從模型庫(kù)中徹底刪除,用戶可以在選中狀態(tài)后,按下鍵盤上的“Del”(刪除鍵)進(jìn)行刪除,也可以在狀態(tài)上右擊,然后選擇“Edit”->"Delete",如上面的圖中的Delete,也可以選擇菜單中的“Edit”->“Delete”來(lái)刪除一個(gè)狀態(tài)。
(4)為狀態(tài)添加動(dòng)作
用戶可以雙擊一個(gè)狀態(tài)或右擊狀態(tài)選擇“Open Specification”打開狀態(tài)規(guī)格說(shuō)明對(duì)話框。打開的狀態(tài)規(guī)范說(shuō)明對(duì)話框如圖20所示。
在“General”選項(xiàng)卡中可以設(shè)置狀態(tài)的名稱、構(gòu)造型、說(shuō)明文檔、是否激活歷史狀態(tài)(淺層)或深層歷史狀態(tài)。
在第2個(gè)選項(xiàng)卡“Actions”中可以添加狀態(tài)的動(dòng)作,如下圖:
圖23 Actions選項(xiàng)卡
在空白處右擊,選擇“Insert”,可以為其添加一個(gè)動(dòng)作。
圖24 為狀態(tài)添加動(dòng)作
添加后的動(dòng)作如下圖所示:
圖25 添加動(dòng)作后的效果
我們可以在動(dòng)作所在的行上雙擊或右擊后選擇“Specification...”,其會(huì)彈出如下圖所示的對(duì)話框:
圖26 動(dòng)作的規(guī)格說(shuō)明
在該對(duì)話框中的“When”對(duì)應(yīng)的下拉列表中可以設(shè)置動(dòng)作的類型,其中“On Entry”代表進(jìn)入動(dòng)作,“On Exit”代表退出動(dòng)作,“Do”代表內(nèi)部執(zhí)行的活動(dòng),“On Event”代表內(nèi)部事件轉(zhuǎn)移。Type用于指定動(dòng)作的類型是一個(gè)普通動(dòng)作(Action)還是發(fā)送一個(gè)事件(Send Event)。
當(dāng)“When”中選擇的是“On Event”時(shí),在“When”下邊的“On Event”分組框中可以設(shè)置事件的名稱、參數(shù)和條件。
下圖是On Event的一個(gè)設(shè)置情景:
圖27 動(dòng)作規(guī)格說(shuō)明的例子
下圖是對(duì)“已借出”狀態(tài)設(shè)置的相關(guān)動(dòng)作。
圖28 設(shè)置了動(dòng)作的狀態(tài)規(guī)格說(shuō)明
在工具相中選擇“狀態(tài)轉(zhuǎn)移”工具,鼠標(biāo)會(huì)變?yōu)橐粋€(gè)向上的空心箭頭的形狀,這時(shí),在源狀態(tài)上按下鼠標(biāo)不放,滑動(dòng)到目的狀態(tài)上后松開鼠標(biāo)即可。
下圖給出了鼠標(biāo)到達(dá)目的狀態(tài)松開之前的一個(gè)情景。
圖29 添加狀態(tài)的轉(zhuǎn)移
松開鼠標(biāo)之后的效果如下圖所示:
圖片
圖30 添加了狀態(tài)轉(zhuǎn)移后的樣子
設(shè)置轉(zhuǎn)移的相關(guān)內(nèi)容
方式一:選中轉(zhuǎn)移后,右擊后選擇“Open Specification...”,如下圖所示:
圖31 右鍵打開轉(zhuǎn)移的規(guī)格說(shuō)明
方式二:雙擊轉(zhuǎn)移。
兩種方式都會(huì)打開下圖所示的狀態(tài)轉(zhuǎn)移規(guī)格說(shuō)明對(duì)話框:
圖32 轉(zhuǎn)移的規(guī)格說(shuō)明——General
在上面圖中“General”選項(xiàng)卡的Event行中添加觸發(fā)轉(zhuǎn)移的事件,在Arguments行中添加事件的參數(shù)。
在“Detail”選項(xiàng)卡中可以對(duì)觸發(fā)事件進(jìn)行詳細(xì)的設(shè)置,如下圖:
圖33 轉(zhuǎn)移個(gè)規(guī)格說(shuō)明——Detail
設(shè)置的內(nèi)容包括“Guard Condition(警戒條件)”、“Action(動(dòng)作)”以及發(fā)送的事件、發(fā)送事件的參數(shù)和發(fā)送的目標(biāo)對(duì)象。
若在General和Detail設(shè)置的內(nèi)容如圖34和圖35中的樣子,則最后在源狀態(tài)和目的狀態(tài)中呈現(xiàn)的樣子如圖36所示:
圖34 轉(zhuǎn)移規(guī)格說(shuō)明例子——General設(shè)置
圖35 轉(zhuǎn)移的規(guī)格說(shuō)明——Detail設(shè)置
圖36 狀態(tài)轉(zhuǎn)移設(shè)置的最終樣子
在添加了主狀態(tài)之后,可以在其主狀態(tài)中,添加子狀態(tài),方法是在工具箱中選擇狀態(tài)后,直接在主狀態(tài)上點(diǎn)擊即可,則在主狀態(tài)中會(huì)添加一個(gè)子狀態(tài)。
下圖顯示了當(dāng)選擇狀態(tài)工具后,鼠標(biāo)滑到主狀態(tài)上時(shí)的情形:
圖37 添加子狀態(tài)
下圖顯示了添加完后的情形:
圖38 子狀態(tài)效果
給子狀態(tài)添加轉(zhuǎn)移等方法與上面有關(guān)內(nèi)容相同。
打開狀態(tài)的規(guī)格說(shuō)明對(duì)話框(雙擊狀態(tài)或右擊選擇“Open Specification...”),在“General”選項(xiàng)卡中把下面的“State/activity history”勾選上,則會(huì)在狀態(tài)的左下角顯示一個(gè)帶圈的H,如果想激活狀態(tài)的深層歷史狀態(tài),就把“Sub state/activity history”也勾選上,則原來(lái)H字母的右上角出現(xiàn)一個(gè)“*”號(hào)。
設(shè)置歷史狀態(tài)的情形如下:
圖39 設(shè)置歷史狀態(tài)
狀態(tài)設(shè)置后的效果如下圖所示:
圖40 歷史狀態(tài)
用戶可以使用本文中4.2中的方法,把水平同步條以及垂直同步條添加到工具箱中,在需要的時(shí)候選擇它后并在繪圖區(qū)點(diǎn)擊一下,即可以添加一個(gè)同步條。
用戶也可以通過(guò)菜單欄中的“Tools”->“Create”中的“Horizontal Synchronization Bar”及“Vertical Synchronization Bar”創(chuàng)建水平同步條或垂直的同步條。如下圖所示的菜單:
圖41 使用菜單添加同步條
若要?jiǎng)?chuàng)建初始狀態(tài),用戶可以直接在工具箱中選擇黑色的實(shí)心圓,在繪圖區(qū)點(diǎn)擊一下就可以創(chuàng)建一個(gè)初始狀態(tài)。
注意:一個(gè)狀態(tài)圖中只允許有一個(gè)初始狀態(tài),如果在一個(gè)繪圖區(qū)中要使用多次初始狀態(tài),用戶可以從左側(cè)瀏覽器中把它拖拽到繪圖區(qū) 中來(lái)。
創(chuàng)建結(jié)束狀態(tài)的方法與創(chuàng)建初始狀態(tài)的方法相同。
在一個(gè)狀態(tài)圖中,可以有多個(gè)結(jié)束狀態(tài)。
以上帶大家學(xué)習(xí)了UML中的狀態(tài)機(jī)圖以及使用Rose繪制狀態(tài)圖的方法。
如有問(wèn)題,請(qǐng)留言。
新聞熱點(diǎn)
疑難解答