解析UML狀態(tài)機(jī)視圖狀態(tài)和轉(zhuǎn)換
本節(jié)和大家一起學(xué)習(xí)一下UML狀態(tài)機(jī)視圖的概念,這里主要介紹一下UML狀態(tài)機(jī)視圖的狀態(tài)和轉(zhuǎn)換兩部分內(nèi)容,相信通過本節(jié)的介紹你對(duì)UML狀態(tài)機(jī)視圖有一定的了解。下面是具體介紹。
UML狀態(tài)機(jī)視圖狀態(tài)和轉(zhuǎn)換
◆狀態(tài)
狀態(tài)描述了一個(gè)類對(duì)象生命期中的一個(gè)時(shí)間段。它可以用三種附加方式說明:在某些方面性質(zhì)相似的一組對(duì)象值;一個(gè)對(duì)象等待一些事件發(fā)生時(shí)的一段時(shí)間;對(duì)象執(zhí)行持續(xù)活動(dòng)時(shí)的一段時(shí)間。雖然狀態(tài)通常是匿名的并僅用處于該狀態(tài)時(shí)對(duì)象進(jìn)行的活動(dòng)描述,但它也可以有名字。
在狀態(tài)機(jī)中,一組狀態(tài)由轉(zhuǎn)換相連接。雖然轉(zhuǎn)換連接著兩個(gè)狀態(tài)(或多個(gè)狀態(tài),如果圖中含有分支和結(jié)合控制),但轉(zhuǎn)換只由轉(zhuǎn)換出發(fā)的狀態(tài)處理。當(dāng)對(duì)象處于某種狀態(tài)時(shí),它對(duì)觸發(fā)狀態(tài)轉(zhuǎn)換的觸發(fā)器事件很敏感。狀態(tài)用具有圓形拐角的矩形表示。如圖6-2所示。
圖6–2狀態(tài)
◆轉(zhuǎn)換
我們?cè)賮砜匆幌耈ML狀態(tài)機(jī)視圖的轉(zhuǎn)換。從狀態(tài)出發(fā)的轉(zhuǎn)換定義了處于此狀態(tài)的對(duì)象對(duì)外界發(fā)生的事件所做出的反應(yīng)。通常,定義一個(gè)轉(zhuǎn)換要有引起轉(zhuǎn)換的觸發(fā)器事件、監(jiān)護(hù)條件、轉(zhuǎn)換的動(dòng)作和轉(zhuǎn)換的目標(biāo)狀態(tài)。表6–2列出了幾種轉(zhuǎn)換和由轉(zhuǎn)換所引起的隱含動(dòng)作。
轉(zhuǎn)換的種類
描述
語法
入口動(dòng)作
進(jìn)入某一狀態(tài)時(shí)執(zhí)行的動(dòng)作
entry/action
出口動(dòng)作
離開某一狀態(tài)時(shí)執(zhí)行的動(dòng)作
exit/action
外部轉(zhuǎn)換
引起狀態(tài)轉(zhuǎn)換或自身轉(zhuǎn)換,同時(shí)執(zhí)行一個(gè)具體的動(dòng)作,包括引起入口動(dòng)作和出口動(dòng)作被執(zhí)行的轉(zhuǎn)換
e(a:T)[exp]/action
內(nèi)部轉(zhuǎn)換
引起一個(gè)動(dòng)作的執(zhí)行但不引起狀態(tài)的改變或不引起入口動(dòng)作或出口動(dòng)作的執(zhí)行
e(a:T)[exp]/action
表6–2轉(zhuǎn)換的種類及隱含動(dòng)作
◆1.外部轉(zhuǎn)換
我們先來看一下UML狀態(tài)機(jī)視圖中的外部轉(zhuǎn)換,它是一種改變活動(dòng)狀態(tài)的轉(zhuǎn)換,它是最普通的一種轉(zhuǎn)換。它用從源狀態(tài)到目標(biāo)狀態(tài)的箭頭表示,其他屬性以文字串附加在箭頭旁(如圖6–3所示)。
圖6–3外部轉(zhuǎn)換
◆2.觸發(fā)器事件
觸發(fā)器事件是引起轉(zhuǎn)換的事件。事件可以有參數(shù),以供轉(zhuǎn)換的動(dòng)作使用。如果一個(gè)信號(hào)有后代,那么信號(hào)中的任一個(gè)后代都可以引起轉(zhuǎn)換。例如,如果轉(zhuǎn)換將MouseButton作為觸發(fā)器,那么MouseButtonDown可以觸發(fā)這個(gè)轉(zhuǎn)換(如圖6–1)。
事件并不是持續(xù)發(fā)生的,它只在時(shí)間的一點(diǎn)上發(fā)生。當(dāng)一個(gè)對(duì)象接收到一個(gè)事件時(shí),如果它沒有空閑時(shí)間來處理事件,就將事件保存起來。對(duì)象一次只處理一個(gè)事件,在對(duì)象處理事件時(shí)轉(zhuǎn)換必須激發(fā),事件過后是不會(huì)被記住的(某些特殊的延遲事件除外,在觸發(fā)一個(gè)轉(zhuǎn)換前或處延遲被解除前,這類事件被保存起來)。如果兩個(gè)事件同時(shí)發(fā)生,它們被每次處理一個(gè)。沒有觸發(fā)任何轉(zhuǎn)換的事件被簡(jiǎn)單地忽略或遺棄,這并不是一個(gè)錯(cuò)誤,忽略不想要的事件要比詳細(xì)指明所有事件容易得多。
◆3.監(jiān)護(hù)條件
UML狀態(tài)機(jī)視圖中轉(zhuǎn)換可能具有一個(gè)監(jiān)護(hù)條件,監(jiān)護(hù)條件是一個(gè)布爾表達(dá)式。監(jiān)護(hù)條件可以引用對(duì)象的屬性值和觸發(fā)事件的參數(shù)。當(dāng)一個(gè)觸發(fā)器事件被觸發(fā)時(shí),監(jiān)護(hù)條件被賦值。如果布爾表達(dá)式的值為“真”,那么觸發(fā)事件即,使轉(zhuǎn)換有效。如果布爾表達(dá)式的值為“假”,則不會(huì)引起轉(zhuǎn)換。監(jiān)護(hù)條件只能在觸發(fā)事件發(fā)生時(shí)被賦值一次。如果在轉(zhuǎn)換發(fā)生后監(jiān)護(hù)條件由原來的“假”變?yōu)?ldquo;真”,則因?yàn)橘x值太遲而不能觸發(fā)轉(zhuǎn)換。
從一個(gè)狀態(tài)引出的多個(gè)轉(zhuǎn)換可以有同樣的觸發(fā)器事件,但是每個(gè)轉(zhuǎn)換必須具有不同的監(jiān)護(hù)條件。當(dāng)其中一個(gè)監(jiān)護(hù)條件滿足時(shí),觸發(fā)器事件會(huì)引起相應(yīng)的轉(zhuǎn)換。通常,監(jiān)護(hù)條件的設(shè)置要考慮到各種可能的情況以確保一個(gè)觸發(fā)器事件的發(fā)生應(yīng)該能夠引起某些轉(zhuǎn)換。如果有些情況沒有考慮到,一個(gè)觸發(fā)器事件沒有引起任何轉(zhuǎn)換,那么在狀態(tài)機(jī)視圖中要忽略這個(gè)事件。一個(gè)事件的發(fā)生只能同時(shí)引起一個(gè)轉(zhuǎn)換(在一個(gè)控制線程中)。如果一個(gè)事件可能引起多個(gè)轉(zhuǎn)換,那么其中只有一個(gè)轉(zhuǎn)換有效。如果兩個(gè)相互矛盾的轉(zhuǎn)換同時(shí)有效,則無法確定到底發(fā)生了哪個(gè)轉(zhuǎn)換。這兩個(gè)轉(zhuǎn)換隨機(jī)地發(fā)生一個(gè),或者由系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié)決定究竟發(fā)生哪一個(gè),但是對(duì)建模者來說,無法預(yù)料這種轉(zhuǎn)換產(chǎn)生的后果。#p#
◆4.完成轉(zhuǎn)換
沒有標(biāo)明觸發(fā)器事件的轉(zhuǎn)換是由狀態(tài)中的活動(dòng)的完成引起的(即完成轉(zhuǎn)換)。完成轉(zhuǎn)換也可以帶一個(gè)監(jiān)護(hù)條件,這個(gè)監(jiān)護(hù)條件是在狀態(tài)中的活動(dòng)完成時(shí)被賦值的(而不是完成以后)。
◆5.動(dòng)作
當(dāng)轉(zhuǎn)換被引起時(shí),它對(duì)應(yīng)的動(dòng)作被執(zhí)行。UML狀態(tài)機(jī)視圖中動(dòng)作是原子性的,一般是一個(gè)簡(jiǎn)短的計(jì)算處理過程,通常是一個(gè)賦值操作或算術(shù)計(jì)算。另外還有一些動(dòng)作,包括給另一個(gè)對(duì)象發(fā)送消息、調(diào)用一個(gè)操作、設(shè)置返回值、創(chuàng)建和銷毀對(duì)象,沒有被定義的控制動(dòng)作用外部語言來進(jìn)行詳細(xì)說明。動(dòng)作也可以是一個(gè)動(dòng)作序列,即一系列簡(jiǎn)單的動(dòng)作。動(dòng)作或動(dòng)作序列的執(zhí)行不會(huì)被同時(shí)發(fā)生的其他動(dòng)作影響或終止。按照UML中的概念,動(dòng)作的執(zhí)行時(shí)間非常短,與外界事件所經(jīng)歷的時(shí)間相比是可以忽略的,因此,在動(dòng)作的執(zhí)行過程中不能再插入其他事件。然而,實(shí)際上任何動(dòng)作的執(zhí)行都要耗費(fèi)一定時(shí)間,新到來的事件必須被安置在一個(gè)隊(duì)列中。
整個(gè)系統(tǒng)可以在同一時(shí)間執(zhí)行多個(gè)動(dòng)作。我們說動(dòng)作是原子性的,并不是說整個(gè)系統(tǒng)是原子性的。系統(tǒng)能夠處理硬件的中斷和多個(gè)動(dòng)作的時(shí)間共享。動(dòng)作在它的控制線程中是原子性的。一旦開始執(zhí)行,它必須執(zhí)行到底并且不能與同時(shí)處于活動(dòng)狀態(tài)的動(dòng)作發(fā)生交互作用。但動(dòng)作不能用于表達(dá)處理過程很長(zhǎng)的事物。與系統(tǒng)處理外部事件所需要的反應(yīng)時(shí)間相比,動(dòng)作的執(zhí)行過程應(yīng)該很簡(jiǎn)潔,否則系統(tǒng)不能夠做到實(shí)時(shí)響應(yīng)。
一個(gè)動(dòng)作可以使用觸發(fā)器事件的參數(shù)和對(duì)象的屬性值作為表達(dá)式的一部分。
表6–3列出了各種動(dòng)作及描述。
表6–3動(dòng)作的種類
◆6.狀態(tài)改變
當(dāng)動(dòng)作執(zhí)行完畢后,轉(zhuǎn)換的目標(biāo)狀態(tài)被激活,這時(shí)會(huì)觸發(fā)出口動(dòng)作或入口動(dòng)作的執(zhí)行。
◆7.嵌套狀態(tài)
狀態(tài)可以被嵌套在其他的組成狀態(tài)之內(nèi)(看下一段)。從一個(gè)外部狀態(tài)出發(fā)的轉(zhuǎn)換可以應(yīng)用于這個(gè)狀態(tài)所有的內(nèi)部嵌套狀態(tài)。任何一個(gè)內(nèi)部嵌套狀態(tài)被激活時(shí),轉(zhuǎn)換都有可能發(fā)生。組成狀態(tài)可用于表達(dá)例外和異常,因?yàn)榻M成狀態(tài)上的轉(zhuǎn)換適用于所有它所嵌套的狀態(tài),不需要每個(gè)嵌套狀態(tài)顯式地單獨(dú)處理異常。
◆8.入口和出口動(dòng)作
一個(gè)跨越多個(gè)嵌套層次的轉(zhuǎn)換可能會(huì)離開或進(jìn)入某個(gè)狀態(tài)。只要轉(zhuǎn)換進(jìn)入或離開某個(gè)狀態(tài),則該狀態(tài)可能包含要被執(zhí)行的動(dòng)作。進(jìn)入一個(gè)狀態(tài)可能會(huì)執(zhí)行一個(gè)依附于該狀態(tài)的入口動(dòng)作。如果轉(zhuǎn)換離開初始狀態(tài),那么在轉(zhuǎn)換的動(dòng)作和新狀態(tài)的入口動(dòng)作被執(zhí)行前,執(zhí)行該狀態(tài)的出口動(dòng)作。
入口動(dòng)作通常用來進(jìn)行狀態(tài)所需要的內(nèi)部初始化。因?yàn)椴荒芑乇芤粋€(gè)入口動(dòng)作,任何狀態(tài)內(nèi)的動(dòng)作在執(zhí)行前都可以假定狀態(tài)的初始化工作已經(jīng)完成,不需要考慮如何進(jìn)入這個(gè)狀態(tài)。同樣,無論何時(shí)從一個(gè)狀態(tài)離開都要執(zhí)行一個(gè)出口動(dòng)作來進(jìn)行后處理工作。當(dāng)出現(xiàn)代表錯(cuò)誤情況的高層轉(zhuǎn)換使嵌套狀態(tài)異常終止時(shí),出口動(dòng)作特別有用。出口動(dòng)作可以處理這種情況以使對(duì)象的狀態(tài)保持前后一致。入口動(dòng)作和出口動(dòng)作原則上依附于進(jìn)來的和出去的轉(zhuǎn)換,但是將它們聲明為特殊的動(dòng)作可以使?fàn)顟B(tài)的定義不依賴狀態(tài)的轉(zhuǎn)換,因此起到封裝的作用。
◆9.內(nèi)部轉(zhuǎn)換
我們?cè)賮砜匆幌耈ML狀態(tài)機(jī)視圖中內(nèi)部轉(zhuǎn)換。內(nèi)部轉(zhuǎn)換有一個(gè)源狀態(tài)但是沒有目標(biāo)狀態(tài)。內(nèi)部轉(zhuǎn)換的激發(fā)規(guī)則和改變狀態(tài)的轉(zhuǎn)換的激發(fā)規(guī)則相同。由于內(nèi)部轉(zhuǎn)換沒有目標(biāo)狀態(tài),因此轉(zhuǎn)換激發(fā)的結(jié)果不改變本狀態(tài)。如果一個(gè)內(nèi)部轉(zhuǎn)換帶有動(dòng)作,它也要被執(zhí)行,但是沒有狀態(tài)改變發(fā)生,因此也不需要執(zhí)行入口和出口動(dòng)作。內(nèi)部轉(zhuǎn)換用于對(duì)不改變狀態(tài)的插入動(dòng)作建立模型(如,記錄發(fā)生的事件數(shù)目或建立幫助信息屏)。
盡管入口動(dòng)作和出口動(dòng)作的執(zhí)行是由進(jìn)入或離開某狀態(tài)的外部轉(zhuǎn)換所引起的,除了使用保留字entry和exit代替觸發(fā)事件名稱之外,入口和出口動(dòng)作使用與內(nèi)部轉(zhuǎn)換相同的表示法。
一個(gè)自身轉(zhuǎn)移會(huì)激發(fā)狀態(tài)上的入口動(dòng)作和出口動(dòng)作的執(zhí)行(從概念上來講,自身轉(zhuǎn)換從一個(gè)狀態(tài)出發(fā)后又會(huì)到自身狀態(tài)),因此,自身轉(zhuǎn)換不等價(jià)于內(nèi)部轉(zhuǎn)換。圖6–4說明了入口動(dòng)作、出口動(dòng)作和內(nèi)部轉(zhuǎn)換。
圖6–4內(nèi)部轉(zhuǎn)、入口動(dòng)作和出口動(dòng)作
【編輯推薦】
- UML狀態(tài)圖及其組成元素簡(jiǎn)介
- UML狀態(tài)圖創(chuàng)建過程中需要注意問題
- UML建模風(fēng)格 UML狀態(tài)圖表現(xiàn)形式解析
- 在回歸測(cè)試中UML狀態(tài)圖切片的應(yīng)用
- UML用戶指南--UML圖簡(jiǎn)介