第10章狀態(tài)圖_第1頁
第10章狀態(tài)圖_第2頁
第10章狀態(tài)圖_第3頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第10章狀態(tài)圖在一個(gè)交互中,可能發(fā)送給單個(gè)對象一個(gè)或多個(gè)消息, 并且,這些消息以特定的順序被 接收。但是,在另外的交互中, 同一個(gè)對象可能接收完全不同的消息。 根據(jù)各個(gè)交互的詳細(xì) 情況,特定消息發(fā)送到對象的順序也可能根據(jù)情況的不同而改變。 通過考慮對象能夠參與的 所有可能的交互,我們可以看到,在一個(gè)對象的整個(gè)生存期中, 它必須能夠合理地響應(yīng)次序 變動(dòng)范圍相當(dāng)大的消息。在第8章,我們已經(jīng)看到,對象圖不是用來詳細(xì)說明系統(tǒng)所有可能的狀態(tài)的。首先,的其次,除了要知道可能的狀態(tài)是什么,我們還需要出于完全相同的原因, 順序圖和協(xié)作圖也不是用來文檔來自于網(wǎng)絡(luò)搜索確存在著太多的狀態(tài),不能用文檔窮舉; 知道哪些

2、狀態(tài)是不可能,或者不合法的。 描述對象能夠參與的所有可能交互的視圖。對這兩種情況,解決方案是相同的,即使用表示法的更抽象的形式詳細(xì)說明系統(tǒng),而不是舉例說明。在UML中,對象的行為規(guī)格說明是通過為對象定義 狀態(tài)機(jī)來給出的。狀態(tài)機(jī) 說明了對象對它在生存期期間可能檢測到的事件的響應(yīng)。在UML中,狀態(tài)機(jī)通常是用一種 稱為狀態(tài)圖的圖來文檔化的。文檔來自于網(wǎng)絡(luò)搜索交互圖和狀態(tài)機(jī)給出的是系統(tǒng)動(dòng)態(tài)行為的兩個(gè)互補(bǔ)的視圖。交互圖顯示了在較短的一段時(shí)間在系統(tǒng)中的對象之間傳遞的消息,通常是在單個(gè)用戶產(chǎn)生的事務(wù)期間,因此這些圖必需描述很多對象,即特定事務(wù)中所涉及的那些對象。另一方面,狀態(tài)圖自始至終在一個(gè)單個(gè)對象的整個(gè)生

3、存期中跟蹤該對象,指定該對象能夠接收的所有可能的消息序列,以及它對這些消息的響應(yīng)。文檔來自于網(wǎng)絡(luò)搜索10.1依賴狀態(tài)的行為許多對象展現(xiàn)出了 依賴狀態(tài)的行為。不嚴(yán)密地說,這意味著對象在不同時(shí)間將對相同的刺激做出不同的響應(yīng)。例如,考慮一個(gè)簡單的CD播放機(jī)的行為,播放機(jī)包括一個(gè)裝 CD的抽屜,如果當(dāng)前有播放的CD,就放在抽屜里。還包括一個(gè)界面,界面包含三個(gè)按鈕, 標(biāo)明"裝 入load、"播放play和"停止stop。如果當(dāng)前抽屜關(guān)著,裝入按鈕使之翻開, 如果是翻開的,那么使之關(guān)閉。停止按鈕使播放機(jī)停止正在進(jìn)行的播放。如果沒有正在播放的CD時(shí),按下停止按鈕不起作用。最后,

4、播放按鈕播放抽屜中的CD,如果按下播放按鈕時(shí)抽屜是翻開的,那么先關(guān)閉抽屜后再開始播放。文檔來自于網(wǎng)絡(luò)搜索這個(gè)CD播放機(jī)至少在兩個(gè)方面表現(xiàn)出了依賴狀態(tài)的行為。例如,如果抽屜開著,按下“裝入按鈕將關(guān)閉抽屜,而抽屜關(guān)著的時(shí)候,按下“裝入按鈕將翻開抽屜。另外,如果正在播放CD,按下停止按鈕就停止播放,但是如果沒有播放CD,按這個(gè)按鈕沒有作用。文檔來自于網(wǎng)絡(luò)搜索在這個(gè)例子中,我們可以標(biāo)識CD播放機(jī)能夠處于的至少三個(gè)不同狀態(tài)。按下“裝入按鈕引起的不同結(jié)果說明我們需要區(qū)別“翻開open和“關(guān)閉closed狀態(tài),而按下“停止按鈕的不同結(jié)果說明存在第三個(gè)狀態(tài),可能標(biāo)記為“正在播放playing ,它不同于上面任

5、一個(gè)狀態(tài)。同樣值得注意的是,CD播放機(jī)可以響應(yīng)事件而改變狀態(tài)。例如,重復(fù)地按下“裝入按鈕將引起 CD播放機(jī)在翻開和關(guān)閉狀態(tài)之間轉(zhuǎn)換。文檔來自于網(wǎng)絡(luò)搜索這個(gè)例子中的三個(gè)狀態(tài)符合 CD播放機(jī)的實(shí)際狀態(tài)中可觀察到的差異確實(shí)令人愉快,但是情況并不總是如此。區(qū)分狀態(tài)的根本原那么是,處于一個(gè)特定狀態(tài)的對象,對至少一個(gè)事件 的響應(yīng)和它處于其他狀態(tài)時(shí)對該事件的響應(yīng)不同。因而識別的狀態(tài)可能對應(yīng)于容易發(fā)現(xiàn)的對象的外部特征,也可能并不與之對應(yīng)。文檔來自于網(wǎng)絡(luò)搜索用于行為建模的狀態(tài)的概念應(yīng)該區(qū)別于第2章所討論的狀態(tài),在第2章,對象的狀態(tài)被定義為在給定時(shí)間其屬性的值的整體。狀態(tài)的行為概念比這個(gè)更廣泛:在兩個(gè)時(shí)間一個(gè)對象

6、的屬性很可能不同,可是卻處在相同的行為狀態(tài)。對此,CD播放機(jī)的“關(guān)閉狀態(tài)可以提供一個(gè)例子:抽屜中有或者沒有CD可以被認(rèn)為是CD播放機(jī)不同的屬性值,但是在任一情況下 我們都可以認(rèn)為播放機(jī)處于關(guān)閉狀態(tài)。文檔來自于網(wǎng)絡(luò)搜索行為狀態(tài)的識別并不是一個(gè)嚴(yán)格的過程。狀態(tài)的不同,是通過處于不同狀態(tài)的對象對事件的響應(yīng)不同來區(qū)分的,但是什么看作是不同的響應(yīng),在某種程度上卻是一個(gè)需要判斷的問 題。行為狀態(tài)的重要特性是,第一,一個(gè)對象有假設(shè)干個(gè)可能的狀態(tài),并且在任何給定時(shí)間恰好處于這些狀態(tài)中的一個(gè)。第二,對象可以改變狀態(tài),通常,它在給定時(shí)間所處的狀態(tài)會(huì)由它的歷史決定。最后,在不同時(shí)間,一個(gè)對象可能依賴其狀態(tài)對同一刺激

7、做出不同的響應(yīng)。文檔來自于網(wǎng)絡(luò)搜索10.2狀態(tài)、事件和轉(zhuǎn)換狀態(tài)圖statechart diagram,通常簡稱為statechart,顯示一個(gè)對象可能的狀態(tài),它能夠 檢測到的事件,以及它對這些事件的響應(yīng)。因此,為了構(gòu)造一個(gè)對象的狀態(tài)圖,我們必須首先至少暫時(shí)地確立對象能夠處于什么狀態(tài)以及它能夠檢測什么事件。比方CD播放機(jī)的例子,我們已經(jīng)標(biāo)識了翻開、關(guān)閉和正在播放狀態(tài),這將作為開發(fā)狀態(tài)圖的根底。文檔來自于網(wǎng)絡(luò)搜索用軟件的術(shù)語,經(jīng)常假定,對象檢測到的事件就是發(fā)送給它的消息。然而,在剛開始設(shè)計(jì)時(shí)不必要這么具體:需要的只是對象能夠檢測到的外部事件這個(gè)更一般的概念。在CD播放機(jī)的例子中,能夠檢測到的外部事

8、件只是按下三個(gè)按鈕。因此,CD播放機(jī)的狀態(tài)機(jī)將包括至少三個(gè)事件:"裝入load、"播放play和"停止stop。文檔來自于網(wǎng)絡(luò)搜索一般而言,檢測到一個(gè)事件可能導(dǎo)致對象從一個(gè)狀態(tài)移動(dòng)到另一狀態(tài),這樣的移動(dòng)稱為轉(zhuǎn)換。例如,如果CD播放機(jī)處于翻開狀態(tài),按下裝入按鈕將引起抽屜關(guān)閉,并且CD播放機(jī)移動(dòng)到關(guān)閉狀態(tài)。狀態(tài)圖上顯示的根本信息是實(shí)體的可能狀態(tài)以及它們之間的轉(zhuǎn)換,或換句話說,檢測各種事件的路徑引起系統(tǒng)從一個(gè)狀態(tài)轉(zhuǎn)換到另一個(gè)狀態(tài)。文檔來自于網(wǎng)絡(luò)搜索描述CD播放機(jī)的根本模型的狀態(tài)圖如圖10.1所示。系統(tǒng)的狀態(tài)以圓角矩形表示,其中寫著狀態(tài)的名字。狀態(tài)轉(zhuǎn)換用連接兩個(gè)狀態(tài)的箭頭

9、表示。每個(gè)這樣的箭頭必須標(biāo)注一個(gè)事件的名字。這種箭頭的含意是如果系統(tǒng)在處于箭頭尾的時(shí)候接收到該事件,它將轉(zhuǎn)到箭頭的頭所指向的狀態(tài)。因此,事件通常將在狀態(tài)圖中出現(xiàn)屢次,該對象可能在多個(gè)不同的狀態(tài)檢測到同樣的事件。 文檔來自于網(wǎng)絡(luò)搜索圖10.1 CD播放機(jī)的一個(gè)簡單狀態(tài)機(jī)在圖10.1中,從每個(gè)狀態(tài)都有三個(gè)出發(fā)的箭頭,每一個(gè)事件都可以被CD播放機(jī)檢測到。這種完備性不是狀態(tài)機(jī)的根本性質(zhì),而只是反映了CD播放機(jī)的用戶在任何時(shí)候都可以按下三個(gè)按鈕中的任何一個(gè)的事實(shí)。如果事件沒有引起狀態(tài)的改變,那么相應(yīng)的轉(zhuǎn)換只是在一個(gè)狀態(tài)上形成回路。這種情況的例子是,在CD播放機(jī)已經(jīng)處于正在播放狀態(tài),檢測到播放事件時(shí)發(fā)生的

10、轉(zhuǎn)換。這樣的轉(zhuǎn)換被稱為自轉(zhuǎn)換self-transition 。文檔來自于網(wǎng)絡(luò)搜索事件如同消息一樣,能夠帶有數(shù)據(jù),寫在消息名字后面的括號中。播放機(jī)的例子中沒有 需要攜帶附加數(shù)據(jù)的事件,但在 10.10節(jié)考慮的例子中將看到這樣的例子。 文檔來自于網(wǎng)絡(luò)搜索 狀態(tài)機(jī)的執(zhí)行一個(gè)簡單的狀態(tài)機(jī),如圖10.1中所示的狀態(tài)圖,可以認(rèn)為是按照下面的方式“執(zhí)行。在任何給定時(shí)刻,對象恰好處于圖中所示的狀態(tài)之一。這個(gè)狀態(tài)稱為 激活狀態(tài)(active state )。任何從激活狀態(tài)出發(fā)的轉(zhuǎn)換都是一個(gè)候選激發(fā)。例如,如果CD播放機(jī)的激活狀態(tài)是 “翻開狀態(tài),那么候選激發(fā)的轉(zhuǎn)換有該狀態(tài)上的自轉(zhuǎn)換、標(biāo)記著“裝入的到關(guān)閉狀態(tài)的轉(zhuǎn)換

11、,以 及標(biāo)記著“播放的到達(dá)正在播放狀態(tài)的轉(zhuǎn)換。文檔來自于網(wǎng)絡(luò)搜索能夠引起轉(zhuǎn)換激發(fā)的事件稱為 觸發(fā)器(trigger)。當(dāng)檢測到一個(gè)事件時(shí),該事件將激發(fā) 從激活狀態(tài)出發(fā)的標(biāo)注著該事件名字的轉(zhuǎn)換。這個(gè)激發(fā)的轉(zhuǎn)換的另一端的狀態(tài)就成為激活狀態(tài),這個(gè)過程可以再次重演,不同的是現(xiàn)在的候選激發(fā)將是從新激活狀態(tài)出發(fā)的轉(zhuǎn)換。文檔來自于網(wǎng)絡(luò)搜索從當(dāng)前狀態(tài)出發(fā)的事件如果沒有標(biāo)注為所檢測到事件名字的,就忽略該事件,不激發(fā)任何轉(zhuǎn)換,當(dāng)前狀態(tài)仍是激活狀態(tài)。 如果有必要指定在一個(gè)狀態(tài)是激活的情況下檢測到一個(gè)特 定事件是錯(cuò)誤的時(shí)候, 可以定義一個(gè)錯(cuò)誤狀態(tài), 并增加一個(gè)到錯(cuò)誤狀態(tài)的轉(zhuǎn)換并用被禁止的 事件的名字加以標(biāo)注。文檔來自

12、于網(wǎng)絡(luò)搜索10.3初始狀態(tài)和終止?fàn)顟B(tài)圖10.1中的圖描述了 CD播放機(jī)在使用時(shí)的運(yùn)作機(jī)能,但是沒有說明機(jī)器在開關(guān)時(shí)發(fā)生 什么。我們將假定關(guān)機(jī)器時(shí)它不表現(xiàn)出任何行為,當(dāng)開機(jī)時(shí)它總是直接到關(guān)閉狀態(tài)。文檔來自于網(wǎng)絡(luò)搜索我們可以通過向狀態(tài)圖中參加 初始狀態(tài)表示后一種行為;初始狀態(tài)用黑色的小圓點(diǎn)表示。從初始狀態(tài)出發(fā)的轉(zhuǎn)換表示創(chuàng)立或初始化對象時(shí)進(jìn)入的狀態(tài)。CD播放機(jī)的初始狀態(tài)如圖10.2所示,初始狀態(tài)上的轉(zhuǎn)換表示播放機(jī)在開機(jī)后總是處于關(guān)閉狀態(tài)。注意從初始狀態(tài)出 發(fā)的轉(zhuǎn)換上不應(yīng)該寫任何事件。文檔來自于網(wǎng)絡(luò)搜索圖10.2初始狀態(tài)和終止?fàn)顟B(tài)除了初始狀態(tài),狀態(tài)圖還可以表示 終止?fàn)顟B(tài)。終止?fàn)顟B(tài)代表對象在響應(yīng)撤銷、關(guān)

13、掉,或其他終止事件時(shí)到達(dá)的狀態(tài),終止?fàn)顟B(tài)用大圓圈中加一個(gè)小圓點(diǎn)表示。一般而言,可以從許多不同的狀態(tài)到達(dá)終止?fàn)顟B(tài)。在CD播放機(jī)的例子中,引起到達(dá)終止?fàn)顟B(tài)的事件是關(guān)播放機(jī)。我們可以用一個(gè)稱為“關(guān)機(jī)off的新事件對此建模??梢栽谌魏螘r(shí)刻關(guān)掉播放機(jī),因此 用標(biāo)注為“關(guān)機(jī)事件的轉(zhuǎn)換將終止?fàn)顟B(tài)連接到所有其他狀態(tài)。終止?fàn)顟B(tài)的含意依賴于狀態(tài)圖所描述的對象的特性。 如果一個(gè)軟件對象, 即類的實(shí)例,到達(dá)它的終止?fàn)顟B(tài),那么它將完 全被銷毀:如果它有析構(gòu)函數(shù),那么將調(diào)用析構(gòu)函數(shù),并回收對象占用的內(nèi)存。文檔來自于網(wǎng)絡(luò)搜索然而,圖10.2顯然不應(yīng)該被解釋說 CD播放機(jī)在每次關(guān)機(jī)時(shí)都被實(shí)際地銷毀:這樣的設(shè)計(jì)不可能制造出來投

14、入市場。實(shí)際模擬的是控制CD播放機(jī)的軟件的行為:當(dāng)關(guān)掉播放機(jī)時(shí)終止控制程序,并且機(jī)器將不響應(yīng)任何事件,直到再次開機(jī)。文檔來自于網(wǎng)絡(luò)搜索10.4監(jiān)護(hù)條件圖10.2中的狀態(tài)圖對CD播放機(jī)的行為給出了一個(gè)過分簡單的描述。有一個(gè)問題是,當(dāng)按下播放按鈕時(shí),播放機(jī)并不總是進(jìn)入正在播放狀態(tài),而是當(dāng)檢測到該事件時(shí)如果抽屜中有CD才進(jìn)入正在播放狀態(tài),否那么如果抽屜還沒有關(guān)閉就只是關(guān)閉抽屜并且進(jìn)入關(guān)閉狀態(tài)。這意味著在準(zhǔn)確的模型中,關(guān)閉和翻開兩個(gè)狀態(tài)都應(yīng)該包含始于它們的兩個(gè)標(biāo)注為“播放的轉(zhuǎn)換。在任何給定時(shí)刻,實(shí)際上沿哪個(gè)轉(zhuǎn)換前進(jìn)將取決于在該時(shí)間抽屜中的內(nèi)容。文檔來自于網(wǎng)絡(luò)搜索圖10.3按下“播放時(shí)的兩種可能后果圖1

15、0.3顯示了在CD播放機(jī)抽屜關(guān)著的時(shí)候按下“播放按鈕的兩種可能的后果。這是一個(gè)非確定狀態(tài)圖的例子。這個(gè)圖說明播放事件可以觸發(fā)兩個(gè)可能的轉(zhuǎn)換,但并沒有說明何時(shí)將激發(fā)其中的一個(gè)轉(zhuǎn)換而不是另一個(gè)。文檔來自于網(wǎng)絡(luò)搜索原那么上,不確定的圖沒有任何錯(cuò)誤,但是如果建模的系統(tǒng)事實(shí)上是確定的,那么不確定的圖必定是遺漏了系統(tǒng)的某些信息。在CD播放機(jī)的例子中,當(dāng)按鈕按下時(shí)不存在真正的非確定性,因?yàn)椴シ艡C(jī)接下來的行為由抽屜中的內(nèi)容確定。更準(zhǔn)確的模型應(yīng)該說明是什么導(dǎo)致沿著一個(gè)轉(zhuǎn)換而不是另一個(gè)轉(zhuǎn)換前進(jìn),以消除圖10.3中呈現(xiàn)的非確定性。 文檔來自于網(wǎng)絡(luò)搜索在狀態(tài)圖上,這樣的信息可以通過為播放轉(zhuǎn)換增加監(jiān)護(hù)條件來表示,說明在

16、什么情況下將激發(fā)該轉(zhuǎn)換。監(jiān)護(hù)條件是轉(zhuǎn)換的規(guī)格說明的一局部,寫在標(biāo)注該轉(zhuǎn)換的事件名字之后,并用方括號括起來。監(jiān)護(hù)條件通常以非正式的英語寫出,如這里一樣,但是如果要求,可以用更形式化的符號,如第 12章描述的OCL語言寫出。文檔來自于網(wǎng)絡(luò)搜索圖10.4所示的CD播放機(jī)的擴(kuò)充狀態(tài)圖包括了監(jiān)護(hù)條件,區(qū)分了抽屜的非空和空的狀態(tài)。為了簡單起見,與當(dāng)前討論無關(guān)的初始狀態(tài)和終止?fàn)顟B(tài)在這個(gè)圖中省略了。文檔來自于網(wǎng)絡(luò)搜索圖10.4使用監(jiān)護(hù)條件區(qū)分轉(zhuǎn)換監(jiān)護(hù)條件對狀態(tài)機(jī)執(zhí)行的影響如下。當(dāng)檢測到一個(gè)事件時(shí),將對標(biāo)注著該事件名字的轉(zhuǎn)換上的監(jiān)護(hù)條件求值。如果轉(zhuǎn)換有監(jiān)護(hù)條件,那么只有在求值為真時(shí)這個(gè)轉(zhuǎn)換才會(huì)激發(fā)。如果所有監(jiān)護(hù)

17、條件都是假值,并且沒有無監(jiān)護(hù)的轉(zhuǎn)換,就忽略該事件。文檔來自于網(wǎng)絡(luò)搜索如果多個(gè)轉(zhuǎn)換有值為真的監(jiān)護(hù)條件,那么它們中只能有一個(gè)被激發(fā)。在這種情況下,非確定性再次引入到狀態(tài)機(jī), 通常,要對一組離開轉(zhuǎn)換上的監(jiān)護(hù)條件進(jìn)行挑選,以使得在任何給定時(shí)間,為真的不能超過一個(gè)。文檔來自于網(wǎng)絡(luò)搜索例如,假定CD播放機(jī)正處于翻開狀態(tài)時(shí)按下了播放按鈕。發(fā)生的第一件事情是關(guān)閉抽屜;這是必要的,以便機(jī)器能夠檢測是否有碟片。重要的是要注意在這個(gè)時(shí)候,盡管事實(shí)上抽屜是關(guān)閉的,但 CD播放機(jī)并不是在關(guān)閉狀態(tài)。仍然是在翻開狀態(tài)下,評估播放轉(zhuǎn)換上的 監(jiān)護(hù)條件的值,看應(yīng)該激發(fā)哪個(gè)轉(zhuǎn)換。這說明了前面提出的一點(diǎn),CD播放機(jī)的狀態(tài)機(jī)中的狀態(tài)不

18、必要和CD播放機(jī)的實(shí)際狀態(tài)恰好對應(yīng)。文檔來自于網(wǎng)絡(luò)搜索如果有CD,將激發(fā)從翻開狀態(tài)到正在播放狀態(tài)的轉(zhuǎn)換。狀態(tài)機(jī)直接從翻開轉(zhuǎn)到正在播放狀態(tài),并且不經(jīng)過關(guān)閉狀態(tài),即使是暫時(shí)地。如果經(jīng)過,那么它必須檢測到第二個(gè)事件以激發(fā)它到正在播放狀態(tài)的轉(zhuǎn)換。然而,只有單獨(dú)一個(gè)事件,即按下播放按鈕事件,是將它從翻開狀態(tài)轉(zhuǎn)換到正在播放狀態(tài)所必需的。如果需要,抽屜關(guān)閉的物理事實(shí)在狀態(tài)圖上可以作為動(dòng)作建模,如下節(jié)所描述的。文檔來自于網(wǎng)絡(luò)搜索10.5動(dòng)作狀態(tài)圖能夠說明對象響應(yīng)檢測到的特定事件時(shí)做些什么。這通過在圖中的相關(guān)轉(zhuǎn)換上增加動(dòng)作來說明。動(dòng)作寫在事件名字之后,前面加斜線。圖10.5所示的是CD播放機(jī)的狀態(tài)圖,參加了動(dòng)作

19、表示抽屜實(shí)際翻開和關(guān)閉的時(shí)間。文檔來自于網(wǎng)絡(luò)搜索動(dòng)作可以用英語以偽代碼的方式描述,也可以使用目標(biāo)編程語言的符號。轉(zhuǎn)換經(jīng)常既帶有條件,還帶有動(dòng)作。如果是這樣,條件緊跟在事件名字之后,動(dòng)作寫在條件的后面。文檔來自于網(wǎng)絡(luò)搜索動(dòng)作被看作是簡短的、 自包含的一段處理, 所花費(fèi)的完成時(shí)間可以忽略。動(dòng)作的定義特征是它在轉(zhuǎn)換到達(dá)新狀態(tài)之前完成。這隱含著動(dòng)作不能由對象可能檢測到的任何其他事件中 斷,而必須總是執(zhí)行完成。在這個(gè)意義上,不是原子的動(dòng)作,或者對象處于給定狀態(tài)時(shí)執(zhí)行 的處理,可以通過 活動(dòng)而不是動(dòng)作描述,如第10.6節(jié)所描述的。文檔來自于網(wǎng)絡(luò)搜索pUynopi町 |no CDdra'ArClos

20、ed'x«n drawerplay CD pro«n(皿0闊 drawer圖10.5操縱CD播放機(jī)抽屜的動(dòng)作入口和出口動(dòng)作假定每次抽屜中有CD時(shí)如果按下播放按鈕,CD播放機(jī)的播放頭都將自己定位到當(dāng)前曲 目的開始。這可以在狀態(tài)圖上表示,方法是在每個(gè)標(biāo)注“播放的到達(dá)正在播放狀態(tài)的轉(zhuǎn)換 上寫一個(gè)適當(dāng)?shù)膭?dòng)作。但是,這相當(dāng)不妥而且累贅,可以用更節(jié)省的方法到達(dá)相同的效果, 即在正在播放狀態(tài)中包含一個(gè) 入口動(dòng)作,如圖10.6所示。文檔來自于網(wǎng)絡(luò)搜索每當(dāng)一個(gè)狀態(tài)變?yōu)榧せ顮顟B(tài)時(shí),緊接在通向該狀態(tài)的轉(zhuǎn)換上的動(dòng)作完成之后就執(zhí)行入口動(dòng)作。例如,如果 CD播放機(jī)處于翻開狀態(tài),這時(shí)按下播放按鈕

21、,會(huì)關(guān)閉抽屜并激發(fā)到正在 播放狀態(tài)的轉(zhuǎn)換。結(jié)果正在播放狀態(tài)變成激活的,正在播放狀態(tài)中的入口動(dòng)作會(huì)立即被執(zhí)行。文檔來自于網(wǎng)絡(luò)搜索狀態(tài)還可以有 出口動(dòng)作,只要離開該狀態(tài)的轉(zhuǎn)換激發(fā)時(shí)就會(huì)執(zhí)行。圖10.6中的出口動(dòng)作表示只要執(zhí)行了引起停止 CD播放的動(dòng)作,首先發(fā)生的事情就是提起CD播放機(jī)的播放頭。文檔來自于網(wǎng)絡(luò)搜索圖10.6 入口和出口動(dòng)作注意,自轉(zhuǎn)換被看作狀態(tài)改變。 當(dāng)一個(gè)狀態(tài)上的自轉(zhuǎn)換激發(fā)時(shí),這個(gè)狀態(tài)暫時(shí)不再是激活的,然后被再激活。這意味著,當(dāng)沿著自轉(zhuǎn)換前進(jìn)時(shí),如果該狀態(tài)存在入口動(dòng)作和出口動(dòng)作,那么首先執(zhí)行出口動(dòng)作,接著執(zhí)行入口動(dòng)作。在圖10.6中,這意味著當(dāng)CD正在播放時(shí)按下播放按鈕的結(jié)果是播放

22、頭回到當(dāng)前曲目的開頭,從而重新開始這個(gè)曲目。實(shí)際上很多CD播放機(jī)都展現(xiàn)出了這種行為。文檔來自于網(wǎng)絡(luò)搜索10.6活動(dòng)顯然,當(dāng)處于正在播放狀態(tài)時(shí),CD播放機(jī)正在做某些事情,即播放 CD的當(dāng)前曲目。要花費(fèi)時(shí)間完成的延續(xù)的操作可以表示為狀態(tài)中的活動(dòng)(activity )。和動(dòng)作一樣,活動(dòng)也寫在 狀態(tài)之中,前面加上"do標(biāo)記,如圖10.7所示。文檔來自于網(wǎng)絡(luò)搜索Playing=rty,' find start MLrack; Icwe r圖10.7播放曲目的活動(dòng)動(dòng)作和活動(dòng)之間的區(qū)別是這樣的, 動(dòng)作被認(rèn)為是瞬時(shí)的, 活動(dòng)不同,是發(fā)生在一段延續(xù) 的時(shí)期之內(nèi)。當(dāng)狀態(tài)成為激活狀態(tài)時(shí),它的入口動(dòng)

23、作被執(zhí)行,然后開始它的活動(dòng), 并且在狀態(tài)處于激活的整個(gè)期間該活動(dòng)都持續(xù)運(yùn)行。 文檔來自于網(wǎng)絡(luò)搜索在對象能夠響應(yīng)任何事件之前,必須完成入口動(dòng)作。 然而,活動(dòng)可以被任何引起激發(fā)離開包含該活動(dòng)的狀態(tài)的轉(zhuǎn)換的事件所中斷。例如,在曲目結(jié)束之前如果檢測到“停止事件,那么播放曲目的活動(dòng)會(huì)被中斷并停止。當(dāng)離開一個(gè)狀態(tài)的轉(zhuǎn)換激發(fā)時(shí), 在執(zhí)行出口動(dòng)作之前,活動(dòng)的執(zhí)行被中斷。文檔來自于網(wǎng)絡(luò)搜索完成轉(zhuǎn)換除了被事件中斷,一些活動(dòng)會(huì)自動(dòng)地結(jié)束。例如,對圖10.7中的正在播放狀態(tài)中的活動(dòng),如果到了曲目結(jié)束時(shí)就會(huì)出現(xiàn)這種情況。在某些情況下,活動(dòng)終止會(huì)引起狀態(tài)轉(zhuǎn)換,狀態(tài)圖應(yīng)該指定接下來哪個(gè)狀態(tài)成為激活狀態(tài)。文檔來自于網(wǎng)絡(luò)搜索血

24、ariwu track OHjnt圖10.8完成轉(zhuǎn)換可以利用完成轉(zhuǎn)換(completion transition )做到這點(diǎn)。完成轉(zhuǎn)換是沒有事件標(biāo)注的轉(zhuǎn)換。在狀態(tài)的內(nèi)部活動(dòng)正常終止,沒有被外部事件中斷時(shí),完成轉(zhuǎn)換可以觸發(fā)。 圖10.8顯示了 CD播放機(jī)具有兩個(gè)完成轉(zhuǎn)換的正在播放狀態(tài),一個(gè)轉(zhuǎn)換從正在播放狀態(tài)通向關(guān)閉狀態(tài),另一個(gè)是正在播放狀態(tài)上的自轉(zhuǎn)換。當(dāng)CD播放機(jī)正在播放時(shí),用戶可以按下播放或停止按鈕中斷當(dāng)前曲目,如果這兩個(gè)事件都沒有被檢測到,當(dāng)前曲目最后會(huì)結(jié)束。在這種情況下,沒有檢測到外部事件,所以僅有完成轉(zhuǎn)換是激發(fā)的候選轉(zhuǎn)換。下來發(fā)生什么將取決于剛剛結(jié)束的曲目是否是CD的最后一個(gè)曲目。文檔來

25、自于網(wǎng)絡(luò)搜索完成轉(zhuǎn)換帶有監(jiān)護(hù)條件以區(qū)分這兩種情況。如果剛剛播放完了最后一個(gè)曲目,到關(guān)閉狀態(tài)的轉(zhuǎn)換將激發(fā),CD播放機(jī)將完全停止播放。否那么,將激發(fā)自轉(zhuǎn)換:曲目計(jì)數(shù)器遞增,再 次進(jìn)入正在播放狀態(tài),CD播放機(jī)將開始播放 CD上的下一個(gè)曲目。 文檔來自于網(wǎng)絡(luò)搜索內(nèi)部轉(zhuǎn)換如上所述,自轉(zhuǎn)換被認(rèn)為是狀態(tài)改變,所以如果圖10.8中的任一個(gè)自轉(zhuǎn)換激發(fā),正在播放狀態(tài)中的活動(dòng)將終止, 并且在再次進(jìn)入該狀態(tài)之前將執(zhí)行狀態(tài)的出口動(dòng)作,然后執(zhí)行入口動(dòng)作,重新開始狀態(tài)的活動(dòng)。文檔來自于網(wǎng)絡(luò)搜索有時(shí),需要對讓對象停在同一狀態(tài),但是不觸發(fā)狀態(tài)的改變以及入口與出口動(dòng)作的執(zhí)行的這樣的事件建模。例如,假定CD播放機(jī)有一個(gè)“信息(in

26、fo )按鈕,當(dāng)按下時(shí)顯示當(dāng)前曲目剩余的時(shí)間,其發(fā)生應(yīng)該不中斷正在進(jìn)行的曲目播放。文檔來自于網(wǎng)絡(luò)搜索這可以作為正在播放狀態(tài)中的內(nèi)部轉(zhuǎn)換來建模。內(nèi)部轉(zhuǎn)換寫在狀態(tài)之中, 標(biāo)注為引起該轉(zhuǎn)換的事件的名字,如圖10.9所示。和自轉(zhuǎn)換不同,內(nèi)部轉(zhuǎn)換不會(huì)引起狀態(tài)的改變,因此也 不會(huì)觸發(fā)入口和出口動(dòng)作。文檔來自于網(wǎng)絡(luò)搜索/Playmgwitiy.1' jind siait MMadxit rai 黃da1 pUy track由甲尊bneci圖10.9有內(nèi)部轉(zhuǎn)換的狀態(tài)10.7組合狀態(tài)圖10.5相當(dāng)混亂和難以理解,而且其中還存在著一些冗余,某些轉(zhuǎn)換以實(shí)質(zhì)上相同的形式出現(xiàn)了不止一次。 如果狀態(tài)圖要在實(shí)際中可

27、用于復(fù)雜系統(tǒng),就需要某些簡化圖的方法。通過允許一個(gè)狀態(tài)包含假設(shè)干 子狀態(tài),提供了一種這樣的技術(shù)。這些子狀態(tài),因?yàn)樗鼈児蚕砹四承┨匦?,這些特性可以更簡明地表示為單獨(dú)一個(gè)“超狀態(tài)的特性,而將這些子狀態(tài)組合成 一組放入一個(gè)狀態(tài)中。文檔來自于網(wǎng)絡(luò)搜索狀態(tài)可以和其他狀態(tài)共享的一個(gè)性質(zhì)是它們的行為,或換句話說是它們參與的轉(zhuǎn)換。例如,當(dāng)CD播放機(jī)處于翻開或關(guān)閉狀態(tài)時(shí),如果抽屜中有CD,它對播放事件的響應(yīng)是一樣的,即轉(zhuǎn)到正在播放狀態(tài),并播放 CD。稍不明顯的是,即使沒有 CD的時(shí)候,響應(yīng)也是相同的: 播放機(jī)結(jié)束于關(guān)閉狀態(tài)。這可能涉及狀態(tài)的改變,也可能不涉及,取決于抽屜原先是翻開的 或關(guān)閉的,但是事件的實(shí)際結(jié)果

28、是相同的。文檔來自于網(wǎng)絡(luò)搜索圖10.10所示的CD播放機(jī)的狀態(tài)圖用超狀態(tài)析出了這個(gè)公共行為。圖中引入了一個(gè)稱為“未播放(not playing )"的新狀態(tài),而翻開和關(guān)閉狀態(tài)現(xiàn)在顯示為這個(gè)新狀態(tài)的子狀態(tài)?!拔床シ艩顟B(tài)通常稱為是由這兩個(gè)嵌套的子狀態(tài)組成的組合狀態(tài)(composite state)。文檔來自于網(wǎng)絡(luò)搜索這個(gè)新狀態(tài)的存在只是為了將 CD播放機(jī)的相關(guān)狀態(tài)分組在一起,并沒有引入任何新行 為的可能性。組合狀態(tài)具有下面的特性。第一,如果組合狀態(tài)是激活的,那么它的子狀態(tài)中只有一個(gè)必須也是激活的。所以在圖10.10中,如果CD播放機(jī)沒有播放,那么它必須處于打開或關(guān)閉兩個(gè)狀態(tài)中的一個(gè)。文檔

29、來自于網(wǎng)絡(luò)搜索第二,在對象處于組合狀態(tài)時(shí)檢測到的事件可以觸發(fā)從組合狀態(tài)本身出發(fā)的轉(zhuǎn)換,或者從當(dāng)前激活的它的子狀態(tài)出發(fā)的轉(zhuǎn)換。例如,假設(shè)CD播放機(jī)處于關(guān)閉狀態(tài)。如果檢測到一個(gè)裝入事件,將激發(fā)通向翻開狀態(tài)的轉(zhuǎn)換,而翻開狀態(tài)將成為激活的。然而,這是未播放狀態(tài)的一個(gè)內(nèi)部轉(zhuǎn)換,所以它仍然是有效的,只不過有一個(gè)不同的激活子狀態(tài)。文檔來自于網(wǎng)絡(luò)搜索play no CD圖10.10 使用子狀態(tài)的CD播放機(jī)但是假設(shè)檢測到的是播放事件。不存在從關(guān)閉狀態(tài)出發(fā)的標(biāo)注為"播放的轉(zhuǎn)換,但是有從未播放狀態(tài)出發(fā)的這樣的轉(zhuǎn)換。因?yàn)檫@個(gè)未播放狀態(tài)也是激活的,所以這些轉(zhuǎn)換將被激活,并且根據(jù)抽屜中是否有 CD,它們之中的一

30、個(gè)或另一個(gè)將被激發(fā)。如果有 CD,正在播放 狀態(tài)將變成激活狀態(tài)。如果沒有 CD,關(guān)閉狀態(tài)將變成激活的,不過是通過從未播放狀態(tài)出 發(fā)的自轉(zhuǎn)換。文檔來自于網(wǎng)絡(luò)搜索子狀態(tài)完全是正常的狀態(tài),并且到達(dá)它們的轉(zhuǎn)換能夠自由地穿過超狀態(tài)的邊界。圖10.10中的從正在播放狀態(tài)出發(fā)的停止和裝入轉(zhuǎn)換說明了這個(gè)特性。它們穿過了 “未播放狀態(tài)的邊界,但是在形式上和含意上對圖 10.5都沒有改變。轉(zhuǎn)換也可以連接一個(gè)超狀態(tài)中的假設(shè)干子 狀態(tài),如翻開狀態(tài)和關(guān)閉狀態(tài)之間的裝入轉(zhuǎn)換所例如的一樣。最后,轉(zhuǎn)換也可以從子狀態(tài)到達(dá)超狀態(tài)之外的一個(gè)狀態(tài),盡管圖10.10中沒有包含相應(yīng)的例子。文檔來自于網(wǎng)絡(luò)搜索組合狀態(tài)的特性組合狀態(tài)中的嵌套

31、狀態(tài)形成了一種“子狀態(tài)圖,并且,除了普通的狀態(tài),組合狀態(tài)還可以包含初始狀態(tài)和終止?fàn)顟B(tài)。組合狀態(tài)中的初始狀態(tài)表示如果到達(dá)組合狀態(tài)的轉(zhuǎn)換終止于 組合狀態(tài)的邊界時(shí),該默認(rèn)子狀態(tài)即成為激活狀態(tài)。組合狀態(tài)中的終止?fàn)顟B(tài)說明狀態(tài)中正在進(jìn)行的活動(dòng)已經(jīng)完成。到達(dá)終止?fàn)顟B(tài)使得從組合狀態(tài)出發(fā)的完成轉(zhuǎn)換能夠激發(fā)。文檔來自于網(wǎng)絡(luò)搜索組合狀態(tài)也可以有自己的入口和出口動(dòng)作。這些狀態(tài)被激活的方式與簡單狀態(tài)每當(dāng)狀態(tài)變成激活的或不再是激活的時(shí)方式完全相同。文檔來自于網(wǎng)絡(luò)搜索例如,假設(shè)按下CD播放機(jī)上的暫停按鈕會(huì)引起播放被中斷。當(dāng)再次按下這個(gè)按鈕時(shí),從暫停的位置開始繼續(xù)播放,也就是說,和按下播放按鈕的情況不同,曲目不用重新開始。圖

32、10.11中的狀態(tài)圖模擬了這種行為。文檔來自于網(wǎng)絡(luò)搜索通過下面一些詳細(xì)的事件序列可以更好地理解這個(gè)圖。假設(shè)CD播放機(jī)處于未播放狀態(tài)而且抽屜中有CD的時(shí)候,按下了播放按鈕,那么標(biāo)注為“播放的轉(zhuǎn)換將激發(fā),使標(biāo)記為“忙碌busy的狀態(tài)成為激活狀態(tài)。因而執(zhí)行該狀態(tài)的入口動(dòng)作,定位到當(dāng)前曲目的開 頭。但是,這個(gè)轉(zhuǎn)換沒有指定忙碌狀態(tài)的哪個(gè)子狀態(tài)變成激活的,所以從初始狀態(tài)到正在播放狀態(tài)的轉(zhuǎn)換激發(fā),使正在播放狀態(tài)成為激活狀態(tài)。因此,開始播放當(dāng)前曲目的活動(dòng)。文檔來自于網(wǎng)絡(luò)搜索如果用戶沒有做任何事情打斷這個(gè)過程,在曲目結(jié)束時(shí),忙碌狀態(tài)中從正在播放狀態(tài)到終止?fàn)顟B(tài)的完成轉(zhuǎn)換將激發(fā),這是狀態(tài)的活動(dòng)終止時(shí)的正常行為。接著

33、觸發(fā)從組合狀態(tài)出發(fā)的一個(gè)完成轉(zhuǎn)換。假設(shè)還有另外的曲目要播放,將激發(fā)忙碌狀態(tài)上的自轉(zhuǎn)換,曲目計(jì)數(shù)器遞增,并再次進(jìn)入忙碌狀態(tài)。如前所述,這將引起定位到新曲目的開頭并開始播放。文檔來自于網(wǎng)絡(luò)搜索現(xiàn)在,假設(shè)用戶在曲目結(jié)束之前按下了暫停按鈕,這將中斷播放曲目的活動(dòng),并引起到達(dá)“暫停paused狀態(tài)的轉(zhuǎn)換激發(fā)。當(dāng)用戶再次按下暫停按鈕時(shí),回到正在播放狀態(tài)的 轉(zhuǎn)換激發(fā),并重新開始播放該曲目的活動(dòng)。然而,在這種情況下,所有的轉(zhuǎn)換都是忙碌狀態(tài)內(nèi)部的,所以不會(huì)觸發(fā)定位到曲目開頭的入口動(dòng)作。因此,播放頭不會(huì)移動(dòng),播放是從中斷的那點(diǎn)重新開始,如所需要的那樣。文檔來自于網(wǎng)絡(luò)搜索10.8歷史狀態(tài)假設(shè)CD播放機(jī)的行為如同圖1

34、0.11所描述的,并且用戶在CD播放機(jī)處于暫停狀態(tài)時(shí)按下 了播放按鈕,那么這將激發(fā)忙碌狀態(tài)上的標(biāo)記為“播放的自轉(zhuǎn)換,因而將退出暫停狀態(tài), 再次進(jìn)入忙碌狀態(tài)。 入口動(dòng)作將導(dǎo)致找到曲目的開頭,因?yàn)樽赞D(zhuǎn)換只是通向組合狀態(tài)的,因此沿著從初始狀態(tài)出發(fā)的轉(zhuǎn)換前進(jìn),使機(jī)器停留在正在播放狀態(tài),播放CD。文檔來自于網(wǎng)絡(luò)搜索但是,假設(shè)CD播放機(jī)展現(xiàn)出的實(shí)際行為不是這樣的,而是在CD播放機(jī)暫停時(shí)按下播放按鈕重新開始該曲目,但播放機(jī)仍然處于暫停狀態(tài)。那么,重新開始播放之前,用戶必須再 次按下暫停按鈕。對此建模的一種方法是將忙碌狀態(tài)上標(biāo)注為“播放的自轉(zhuǎn)換用兩個(gè)自轉(zhuǎn)換代替,一個(gè)標(biāo)注在正在播放狀態(tài)上,一個(gè)標(biāo)注在暫停狀態(tài)上。

35、文檔來自于網(wǎng)絡(luò)搜索然而,如果到組合狀態(tài)的轉(zhuǎn)換能夠“記住上次組合狀態(tài)激活時(shí)哪個(gè)子狀態(tài)是激活的,并能夠自動(dòng)返回到那個(gè)子狀態(tài),就可能防止重復(fù)同樣的轉(zhuǎn)換。如果CD播放機(jī)是在播放,那么按下“播放它應(yīng)該從曲目開始繼續(xù)播放, 但如果播放機(jī)暫停, 那么它將一直暫停到再次 按下暫停按鈕。文檔來自于網(wǎng)絡(luò)搜索通過使用如圖10.12所示的歷史狀態(tài)可以到達(dá)這個(gè)效果。歷史狀態(tài)由圓圈中一個(gè)大寫字母“H表示,并且只能出現(xiàn)在組合狀態(tài)之內(nèi)。到達(dá)歷史狀態(tài)的轉(zhuǎn)換引起組合狀態(tài)中最近的 激活子狀態(tài)再次成為激活的。于是,如果在CD播放機(jī)暫停時(shí)按下“播放按鈕,將沿忙碌狀態(tài)上的自轉(zhuǎn)換進(jìn)行, 終止在歷史狀態(tài)。這將引起一個(gè)到上個(gè)激活子狀態(tài)的隱含轉(zhuǎn)

36、換,在這個(gè)例子中即暫停狀態(tài),如同所需要的那樣。文檔來自于網(wǎng)絡(luò)搜索圖10.12 歷史狀態(tài)在CD播放機(jī)暫停時(shí),如果按下了停止按鈕,隨后按下“播放,圖10.12規(guī)定,CD播放機(jī)將回復(fù)到正在播放狀態(tài)。如果要求它應(yīng)該仍然是暫停的,即使已被停了下來的播放又要再開始,這可以通過將這個(gè)播放轉(zhuǎn)換的末端從忙碌狀態(tài)的邊界延伸到歷史狀態(tài)來建模。文檔來自于網(wǎng)絡(luò)搜索這引發(fā)了一個(gè)問題,如果歷史狀態(tài)是忙碌狀態(tài)的第一個(gè)激活子狀態(tài),將出現(xiàn)什么情況: 根據(jù)定義,在這種情況下應(yīng)該沒有記憶的歷史。在這種情況下,我們必須指定一個(gè)默認(rèn)狀態(tài)成為激活的。這可以通過從歷史狀態(tài)向需要的默認(rèn)狀態(tài)畫一個(gè)無標(biāo)注的轉(zhuǎn)換實(shí)現(xiàn),在這個(gè)例子中,默認(rèn)的是正在播放

37、狀態(tài)。文檔來自于網(wǎng)絡(luò)搜索10.9 CD播放機(jī)總結(jié)圖10.13顯示了一個(gè)描述CD播放機(jī)的行為的完整的狀態(tài)圖,結(jié)合了本章討論的許多要 點(diǎn)。這個(gè)圖源于圖8.10和 8.12的合并。在“未播放狀態(tài)中參加了一個(gè)初始狀態(tài),還參加了 另一個(gè)歷史狀態(tài),表示在沒有 CD播放時(shí)按下停止按鈕沒有作用,不會(huì)引起播放機(jī)的狀態(tài)改 變。文檔來自于網(wǎng)絡(luò)搜索%ot P ay ins對這個(gè)圖進(jìn)一步的擴(kuò)充和修改建議作為本章后面的習(xí)題。Busyfind tradi start廠=Play mgi 劃 play)(1L、PausedJstop=*play CDlast trackIjncremOTl iraACosedfew#bidO

38、penI圖10.13 CD播放機(jī)完整的狀態(tài)圖10.10實(shí)際中的動(dòng)態(tài)建模本節(jié)舉例說明一個(gè)有用的構(gòu)造狀態(tài)圖的過程,并以此說明來自交互圖的信息如何能夠用以導(dǎo)出狀態(tài)圖。使用的例子是下面幾段描述的自動(dòng)售票機(jī)。文檔來自于網(wǎng)絡(luò)搜索售票機(jī)可以接受來自乘客的貨幣和其他輸入,并且在成功交易結(jié)束時(shí)輸出需要的車票以及要找的零錢。沒有交易在進(jìn)行時(shí),機(jī)器顯示信息“需要準(zhǔn)確錢數(shù),或者“可找零錢。顯示的信息決定了下一位顧客為所選的車票或是必須輸入所需要的準(zhǔn)確錢數(shù)的貨幣付款,或是在輸入超過所需要的錢數(shù)時(shí)機(jī)器能夠找零。 文檔來自于網(wǎng)絡(luò)搜索機(jī)器的界面由假設(shè)干按鈕組成,每個(gè)按鈕對應(yīng)給定的一種車票。如果用戶按下這些按鈕中 的一個(gè),機(jī)器

39、就顯示要輸入的錢數(shù),即車票的價(jià)錢。隨著用戶向機(jī)器輸入貨幣,顯示的數(shù)目就根據(jù)用戶輸入的數(shù)量減少。輸入的錢數(shù)一超過或等于車票的價(jià)錢,就發(fā)生下面的兩件事情之一。如果機(jī)器最初顯示的信息是“可找零錢,就輸出需要的車票以及所需找的零錢。如果顯示的信息是“需要準(zhǔn)確錢數(shù),并且用戶輸入的恰好是所需錢數(shù)的貨幣,將只出售一張 車票;如果用戶輸入了過多的貨幣,所有輸入的貨幣都將返回。文檔來自于網(wǎng)絡(luò)搜索在交易開始,用戶可以選擇在選擇車票種類之前先輸入貨幣。如果在最終選擇一種車票時(shí),已經(jīng)輸入了足夠?yàn)樵撥嚻备犊畹呢泿?,就像前面的情況一樣輸出車票和找的零錢。如果輸入的錢數(shù)少于所需車票的價(jià)錢,機(jī)器將顯示剩余的費(fèi)用并像上面的情況

40、一樣繼續(xù)進(jìn)行。文檔來自于網(wǎng)絡(luò)搜索在任何情況下,如果在30秒期間沒有收到用戶的輸入,交易將終止,已經(jīng)輸入了多少錢都會(huì)返回給顧客?!叭∠粹o也可以使用戶能夠明確地說明終止交易。文檔來自于網(wǎng)絡(luò)搜索狀態(tài)機(jī)和事件序列狀態(tài)圖概括了一個(gè)對象能夠接收的所有可能的事件序列。然而,要識別為準(zhǔn)確建立對象的行為模型所需要的所有狀態(tài),有時(shí)相當(dāng)困難。這里介紹的技術(shù)通過一次只考慮一個(gè)事件序列,逐步建立起所需狀態(tài)圖的完整描述,防止了這種困難。文檔來自于網(wǎng)絡(luò)搜索從交互圖中可以獲得多個(gè)各自獨(dú)立的事件序列。到達(dá)一個(gè)對象的消息, 如果按照對象接收它們的順序組織起來,就構(gòu)成了這樣的一個(gè)序列。在該對象的狀態(tài)圖上,必須可能找到對 應(yīng)于各個(gè)

41、這樣的事件序列的路徑。 文檔來自于網(wǎng)絡(luò)搜索在構(gòu)造狀態(tài)圖時(shí),我們可以從選取一個(gè)序列, 并定義一個(gè)只表示該序列的簡單的狀態(tài)圖 開始。然后,將更多的事件序列集成到這個(gè)初步的狀態(tài)圖中,用這種方法,可以用逐步的方式建立起一個(gè)完整的狀態(tài)圖。文檔來自于網(wǎng)絡(luò)搜索本節(jié)剩下的局部將以售票機(jī)的例子說明這個(gè)過程。將考慮售票機(jī)設(shè)計(jì)的一些典型事務(wù)并逐步地建立起一個(gè)完整的狀態(tài)圖。將不畫出正式的對象交互圖,因?yàn)檫@些事務(wù)中只涉及一個(gè)對象,即售票機(jī)本身,而且發(fā)送的消息只是由用戶產(chǎn)生的事件序列。文檔來自于網(wǎng)絡(luò)搜索付款之前選擇車票假設(shè)用戶首先選擇了特定種類的車票,然后相繼輸入了三個(gè)硬幣。 這三個(gè)硬幣的總值超過了車票的價(jià)錢,所以機(jī)器輸

42、出車票以及需要找的零錢,并回到空閑狀態(tài),等待下一次交易。在這種情況下,機(jī)器接收到的是一個(gè)四個(gè)事件的序列:一個(gè)“車票ticket事件,隨后三個(gè)“硬幣coin事件。這些事件中的每個(gè)都有相關(guān)的數(shù)據(jù),即所給出的所選車票的價(jià)錢 和所輸入的各個(gè)硬幣的價(jià)值,但是我們將暫時(shí)忽略這些細(xì)節(jié)。文檔來自于網(wǎng)絡(luò)搜索通過假定每個(gè)事件對應(yīng)于兩個(gè)狀態(tài)之間的一個(gè)轉(zhuǎn)換,可以簡單地為任何單獨(dú)的事件序列畫出一個(gè)非常簡易的狀態(tài)圖;在實(shí)行中,我們在序列的開始和結(jié)束以及每對事件之間放上狀態(tài)。在現(xiàn)在的例子中,我們得到圖10.14所示的狀態(tài)圖。因?yàn)檫@只是一個(gè)初步的圖,所以沒有試圖為這些狀態(tài)加上標(biāo)注。文檔來自于網(wǎng)絡(luò)搜索圖10.14售票機(jī)的初步狀

43、態(tài)圖盡管這個(gè)狀態(tài)機(jī)是所考慮的單個(gè)事件序列的精確的模型,但是還需要對它進(jìn)行一些調(diào) 整,才足以作為售票機(jī)的根底。首先,圖10.14只定義了一次交易,然而售票機(jī)能夠一個(gè)接一個(gè)地執(zhí)行重復(fù)的交易。為了對此建模,我們可以合并圖10.14中的第一個(gè)和最后一個(gè)狀態(tài)。因?yàn)檫@些狀態(tài)代表了沒有正在進(jìn)行交易的情形,我們將這個(gè)新狀態(tài)標(biāo)記為“空閑Idle 。文檔來自于網(wǎng)絡(luò)搜索其次,在上面例如的交易中,硬幣的數(shù)目實(shí)質(zhì)上是任意的。在一次交易中可以輸入任意數(shù)目的硬幣:需要確實(shí)切數(shù)目取決于所選車票的價(jià)錢和輸入硬幣的價(jià)值。需要用某種循環(huán)來表示輸入任意數(shù)目硬幣的可能性。這可以通過將圖10.14中的三個(gè)中間的狀態(tài)合成為一個(gè)帶有自轉(zhuǎn)換的

44、狀態(tài)實(shí)現(xiàn)。文檔來自于網(wǎng)絡(luò)搜索最初交易的狀態(tài)圖的一個(gè)改良版本如圖10.15所示,其中并入了這些修改。這個(gè)圖中只包含兩個(gè)狀態(tài),它是由如上面所闡述的圖10.14最初的五個(gè)狀態(tài)導(dǎo)出的。機(jī)器從空閑狀態(tài)出發(fā),當(dāng)用戶選擇車票時(shí),沿著通向“付票款狀態(tài)的轉(zhuǎn)換前進(jìn)。在隨后輸入硬幣的時(shí)候,可 能發(fā)生兩件事情之一。 如果輸入的錢幣總量足夠付清所選車票的價(jià)錢,那么跟隨的是回到空閑狀態(tài)的轉(zhuǎn)換。但是如果還需要更多的錢,就沿著付款狀態(tài)上的自轉(zhuǎn)換循環(huán),并且必須輸入更多的硬幣才能繼續(xù)處理。文檔來自于網(wǎng)絡(luò)搜索ocinanaiMil)riolftncnhjcoin :aT'jur t廠'$5ueMiand+ran圖1

45、0.15改良的狀態(tài)圖圖10.15使用了前面介紹的一些狀態(tài)圖表示法特征來說明機(jī)器在這次交易中的行為。首先,各種消息附上了參數(shù)以傳送車票的價(jià)錢和輸入機(jī)器的每個(gè)硬幣的價(jià)值。其次,有兩個(gè)從付款狀態(tài)出發(fā)的標(biāo)注為“硬幣的轉(zhuǎn)換。它們由一個(gè)非形式的監(jiān)護(hù)條件區(qū)分,該條件檢查是否已經(jīng)輸入了足夠的錢為所選車票付款。最后,在回到空閑狀態(tài)的轉(zhuǎn)換上還顯示了動(dòng)作,如果已經(jīng)輸入了足夠的錢,機(jī)器將執(zhí)行該動(dòng)作。在這個(gè)例子中,我們假定機(jī)器能夠輸出需要找 的零錢。文檔來自于網(wǎng)絡(luò)搜索選擇車票之前付款我們現(xiàn)在已經(jīng)處理了一種可能的交易,并構(gòu)造了一個(gè)初步的狀態(tài)圖。下一步是考慮第二種交易,并盡可能將它集成到已有的狀態(tài)圖中,并在必要時(shí)擴(kuò)充狀態(tài)圖

46、。文檔來自于網(wǎng)絡(luò)搜索除了首先選擇車票, 售票機(jī)的說明還允許用戶先輸入錢,再選擇需要的車票。 對應(yīng)于這個(gè)交易的事件序列是以假設(shè)干硬幣事件開始,然后在接收到車票事件時(shí)輸出車票和找的零錢, 并結(jié)束交易。我們可以假定,交易從圖10.15中已經(jīng)標(biāo)識的空閑狀態(tài)開始。然而,第一個(gè)事件存在一個(gè)問題,因?yàn)閳D10.15中不包含從空閑狀態(tài)出發(fā)的標(biāo)注為“硬幣的轉(zhuǎn)換。因此需 要用一個(gè)適當(dāng)?shù)霓D(zhuǎn)換擴(kuò)充狀態(tài)圖,通向一個(gè)新狀態(tài)。文檔來自于網(wǎng)絡(luò)搜索同前面的情況中一樣, 可以輸入任意數(shù)目的硬幣,而我們可以利用這個(gè)新狀態(tài)上的自轉(zhuǎn)換對此建模。最后,會(huì)接收一個(gè)車票事件, 而機(jī)器將輸出票和找的零錢,并返回到空閑狀態(tài)。圖10.16所示的狀態(tài)

47、圖增加了這些內(nèi)容。文檔來自于網(wǎng)絡(luò)搜索oin(ani(Hrit'icoin(*nQifiti not enough圖 10.16合并第二個(gè)交易集成交易至今所考慮的兩個(gè)交易互為鏡像。在第一個(gè)交易中,在輸入硬幣之前選擇車票類型,而在第二個(gè)交易中,輸入所有硬幣之后選擇車票類型。然而,售票機(jī)的說明書允許第三種可能性,在選擇車票類型之前先輸入一些硬幣,不過還需要更多的硬幣補(bǔ)足票價(jià)。圖10.16并不滿足這種可能性:一旦已經(jīng)輸入硬幣, 選擇車票類型將使?fàn)顟B(tài)機(jī)回到空閑狀態(tài),沒有輸入更多硬幣繼續(xù)交易的可能性。文檔來自于網(wǎng)絡(luò)搜索需要的是增加一個(gè)標(biāo)注為“車票的轉(zhuǎn)換,從圖10.16中的“插入硬幣狀態(tài)出發(fā)。這個(gè)轉(zhuǎn)

48、換應(yīng)該用一個(gè)條件和已有的轉(zhuǎn)換區(qū)分開。必要的條件和在用戶付票款時(shí)區(qū)分插入硬幣是否會(huì)引起機(jī)器回到空閑狀態(tài)的條件相同,即是否已經(jīng)輸入了足夠的錢數(shù)付清所選車票的價(jià) 錢。文檔來自于網(wǎng)絡(luò)搜索這個(gè)新的轉(zhuǎn)換可以通向一個(gè)新狀態(tài):為了滿足售票機(jī)的說明,新狀態(tài)將必須允許輸入硬幣直到總計(jì)到達(dá)票價(jià),隨之將售出車票,機(jī)器返回到空閑狀態(tài)。然而,這正好是已有的“付 票款狀態(tài)提供的行為,所以可以定義新的轉(zhuǎn)換到達(dá)這個(gè)狀態(tài),如圖10.17所示。狀態(tài)的名字也有所改變,以便更準(zhǔn)確地反映它們之間的相關(guān)差異,即用戶是否已經(jīng)選擇了車票類型。文檔來自于網(wǎng)絡(luò)搜索1 1coinfamouri)丿«no vgi .'issuel/

49、1Ho Ticket SelectedTicketSelectedtcketfcost) 血t moi才LToeiniafTKiinticoir ararti wt enough圖10.17集成兩個(gè)交易從任何給定的事件序列對應(yīng)于穿過狀態(tài)圖的一條連通路徑的意義上來說,圖10.17的狀態(tài)圖概括了在以輸出車票結(jié)束的交易期間用戶能夠產(chǎn)生的所有可能的事件序列。在一個(gè)交易中,可以輸入任意數(shù)目的硬幣, 車票類型可以選擇一次, 并且這些事件能夠以任何次序發(fā)生。 文檔來自于網(wǎng)絡(luò)搜索然而,售票機(jī)的用戶的行為并不總是如此明智的方式進(jìn)行的。容易想象,一個(gè)用戶選擇了一種車票,在輸入硬幣之前又改變了主意,又選擇了另一種車

50、票。圖10.17的狀態(tài)圖不允許這種可能性。一旦選擇了車票種類,機(jī)器就進(jìn)入"已選車票(ticket selected)狀態(tài),而且并沒有從這個(gè)狀態(tài)出發(fā)的車票轉(zhuǎn)換。在用戶實(shí)際能做的和狀態(tài)圖所規(guī)定的之間在這里似乎存在一個(gè)矛盾。 文檔來自于網(wǎng)絡(luò)搜索解釋這種現(xiàn)象的一種方法是注意盡管用戶實(shí)際上可以重復(fù)地按下車票選擇按鈕,但是這未必意味著機(jī)器接收了 “車票事件。例如,情況可能是一旦進(jìn)入了“已選車票狀態(tài),就 使車票選擇按鈕無效,并且只有再次到達(dá)空閑狀態(tài)時(shí)才重新激活。文檔來自于網(wǎng)絡(luò)搜索如果不是這樣,就需要在狀態(tài)圖中給出額外車票事件的明確說明。這能夠以多種方式實(shí)現(xiàn),如果這樣的事件是不被接受的,可能通過引入

51、一個(gè)錯(cuò)誤狀態(tài)實(shí)現(xiàn),或者如果是允許的, 用“已選車票狀態(tài)上的一個(gè)自轉(zhuǎn)換實(shí)現(xiàn)。當(dāng)然,在實(shí)際例子中,在這些選項(xiàng)之間的選擇將 由正在建模的售票機(jī)的實(shí)際行為決定。文檔來自于網(wǎng)絡(luò)搜索圖10.17準(zhǔn)確地模擬了售票機(jī)的根本行為。為了完成模型,說明能夠終止交易的其他方 式,即由于按下取消按鈕或者由于超時(shí)而終止,以及在機(jī)器要求輸入恰好等于票價(jià)的情況下的其他行為,都是必要的。在完成售票機(jī)狀態(tài)圖之前,將先介紹對這些特征建模所需要的符號。文檔來自于網(wǎng)絡(luò)搜索10.11時(shí)間事件如果30秒都沒有收到來自用戶的輸入, 售票機(jī)將超時(shí):當(dāng)前交易將被終止,輸入的錢將 返回給顧客。超時(shí)應(yīng)該作為一個(gè)轉(zhuǎn)換建模, 因?yàn)樗鼘⒏淖兪燮睓C(jī)的狀態(tài),

52、 從交易中的一個(gè)中 間狀態(tài)回到空閑狀態(tài)。然而,應(yīng)該用什么事件標(biāo)注這樣一個(gè)轉(zhuǎn)換并不明顯:畢竟,要點(diǎn)是這樣的轉(zhuǎn)換必須在沒有檢測到事件的時(shí)候精確地激發(fā)。UML定義了專門的 時(shí)間事件,可以用于這些情況中。圖10.18顯示了一個(gè)轉(zhuǎn)換,在進(jìn)入“未選擇車票( no ticket selected)狀態(tài)30 秒后將激發(fā)。這可以如此理解,想象每個(gè)狀態(tài)的一個(gè)隱含活動(dòng)是執(zhí)行一個(gè)計(jì)時(shí)器,在每次進(jìn)入該狀態(tài)時(shí)復(fù)位。一旦計(jì)時(shí)器已經(jīng)運(yùn)行了時(shí)間事件所規(guī)定的一段時(shí)間,就激發(fā)從狀態(tài)出發(fā)的標(biāo)注有時(shí)間事件的轉(zhuǎn)換。在圖10.18中,注意,每次輸入硬幣時(shí)計(jì)時(shí)器復(fù)位,因?yàn)樽赞D(zhuǎn)換被認(rèn)為是狀態(tài)的改變,并觸發(fā)狀態(tài)的入口動(dòng)作。文檔來自于網(wǎng)絡(luò)搜索oo

53、irXamMrit)圖10.18 時(shí)間事件在關(guān)鍵字“ after之后,可以給出任何一段時(shí)間作為參數(shù)。時(shí)間事件的另一種形式由關(guān) 鍵字"when后跟一個(gè)指定的時(shí)間點(diǎn)組成,這定義了一個(gè)在到達(dá)規(guī)定時(shí)間時(shí)將激發(fā)的轉(zhuǎn)換。 文檔來自于網(wǎng)絡(luò)搜索10.12活動(dòng)狀態(tài)在圖10.17中,兩個(gè)轉(zhuǎn)換在交易順利完成后回到空閑狀態(tài)。在每種情況中,都有必要檢查機(jī)器是否能夠退回任何需要找的零錢。如果可以,應(yīng)該輸出找的錢和車票,如果不能,應(yīng)該退回輸入的錢。文檔來自于網(wǎng)絡(luò)搜索這個(gè)行為可以用一對具有適當(dāng)監(jiān)護(hù)條件和動(dòng)作的轉(zhuǎn)換表示,但這些將不得不在每個(gè)回到空閑狀態(tài)的路線上重復(fù)。為了防止這種重復(fù),可以使用活動(dòng)狀態(tài)(activity

54、 state )簡化狀態(tài)圖的結(jié)構(gòu),如圖10.19所示。文檔來自于網(wǎng)絡(luò)搜索活動(dòng)狀態(tài)表示對象執(zhí)行某些內(nèi)部處理的一段時(shí)間。照此,它在狀態(tài)圖上表示為只包含一個(gè)活動(dòng)的狀態(tài)。在圖10.19中,只要顧客對一個(gè)交易的輸入一旦完成,活動(dòng)狀態(tài)就成為激活 的,對應(yīng)于機(jī)器計(jì)算它是否能夠返回為完成該交易所需要找的零錢。文檔來自于網(wǎng)絡(luò)搜索圖10.佃活動(dòng)狀態(tài)活動(dòng)狀態(tài)表示的內(nèi)部處理通常不能被外部事件中斷,在這些情況下,離開活動(dòng)狀態(tài)的唯一轉(zhuǎn)換將是完成交易。在圖10.19中,有兩個(gè)這樣的轉(zhuǎn)換,通過說明是否有找零頭的監(jiān)護(hù)條件區(qū)分。在每個(gè)情況下,這些轉(zhuǎn)換還帶有相應(yīng)的動(dòng)作。文檔來自于網(wǎng)絡(luò)搜索活動(dòng)狀態(tài)在狀態(tài)圖中應(yīng)該慎用,因?yàn)闋顟B(tài)圖的目的

55、通常是說明對象對外部事件的響應(yīng),而不是對內(nèi)部處理詳細(xì)地建模。然而,有時(shí)它們很有用,如在圖10.19中,作為簡化狀態(tài)圖結(jié)構(gòu)的方法。 文檔來自于網(wǎng)絡(luò)搜索10.13售票機(jī)總結(jié)圖10.20給出了售票機(jī)的一個(gè)完整的狀態(tài)圖。它合并了前面幾節(jié)指出的各種要點(diǎn),還顯示出了用戶在交易中間按下取消按鈕的結(jié)果。文檔來自于網(wǎng)絡(luò)搜索為了減少說明交易由于超時(shí)或取消而中斷所需的轉(zhuǎn)換的數(shù)目,圖10.20中包括了一個(gè)組合狀態(tài),其意圖是對應(yīng)于交易正在進(jìn)行的時(shí)間段。文檔來自于網(wǎng)絡(luò)搜索10.14小結(jié)-狀態(tài)圖提供了可以在交互圖上說明的對象的行為方面的規(guī)約。狀態(tài)圖說明了對象在整個(gè)生命期期間能夠檢測到的事件以及對象對這些事件的響應(yīng)。 一般地,對象展示出依賴于狀態(tài)的行為。狀態(tài)的不同由檢測到一個(gè)由對象處于什么狀態(tài)而決定可能有不同結(jié)果的事件來區(qū)分。文檔來自于網(wǎng)絡(luò)搜索檢測到一個(gè)事件可以引起一個(gè) 轉(zhuǎn)換激發(fā),對象從一個(gè)狀態(tài)轉(zhuǎn)到另一個(gè)狀態(tài)。監(jiān)護(hù)條件 能夠用于表示在特定時(shí)刻,一組轉(zhuǎn)換中的哪個(gè)轉(zhuǎn)換實(shí)際上被激發(fā)。動(dòng)作說明了對象對

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論