UML學習筆記之狀態圖

狀態圖的基本概念:

 狀態圖是UML中對系統動態方面建模的圖之一,它通過建立類對象的聲明週期模型來描述對象隨時間變化的動態行爲。

狀態圖用於描述模型元素的實例(如對象或交互)的行爲。它適用於描述狀態和動作的順序,不僅可以展現一個對象擁有的狀態,還可以說明時間如何隨着時間的推移來影響這些狀態。

狀態圖的定義:

先來了解一下狀態機:

狀態機是一種記錄下給定時刻狀態的設備,他可以根據各種不同的輸入對每個給定的變化而改變其狀態或引發一個動作,如計算機、各自客戶端軟件、web上的各種交互頁面都是狀態機。

1.  狀態圖的概念

狀態圖由狀態、轉換、事件、活動和動作5部分組成:

    (1)狀態指的是對象在其生命週期中的一種狀況,處於某個特定狀態中的對象必然會滿足某些條件、執行某些動作或者是等待某些事件。一個狀態的生命週期是一個有限的時間階段。

    (2)轉換指的是兩個不同狀態之間的一種關係,表明對象將在第一個狀態中執行一定的動作,並且在滿足某個特定條件下由某個事件觸發進入第二個狀態。

    (3)事件指的是發生在時間和空間上的對狀態機來講有意義的那些事情。事件通常會引起狀態的變遷,促使狀態機從一種狀態切換到另一種狀態,如信號、對象額度創建和銷燬等。

    (4)活動指的是狀態機中進行的非原子操作。

    (5)動作指的是狀態機中可以執行的那些原子操作,所謂原子操作指的是它們在運行的過程中不能被其他消息所中斷,必須一直執行下去,最終導致狀態的變更或者返回一個值。

狀態

狀態用於對實體在其生命週期中的各種狀況進行建模,一個實體總是在有限的一段時間內保持一個狀態。狀態由一個帶圓角的矩形表示,狀態的描述應該包括:名稱、入口和出口動作、內部轉換和嵌套狀態。

轉換

UML的狀態建模機制中,轉換用帶箭頭的直線表示,一端連接源狀態,箭頭指向目標狀態。轉換還可以標註與此轉換相關的選項,如事件、監護條件和動作等,如果轉換上沒有標註觸發轉換的事件,則表示此轉換自動進行。

如圖,登錄就是源狀態,經過驗證事件的觸發,轉換到登錄成功狀態。

初始狀態

每個狀態圖都應該有一個初始狀態,它代表狀態圖的起始位置。初始狀態是一個僞狀態(一個和普通狀態有連接的假狀態),對象不可能保持在初始狀態,必須要有一個輸出的無觸發轉換(沒有事件觸發器的轉換)。通常初始狀態上的轉換是無監護條件的,並且初始狀態只能作爲轉換的源,而不能作爲轉換的目標。
一個狀態圖只能有一個初始狀態,用一個實心的圓表示。

終止狀態

終止狀態是一個狀態圖的終點,一個狀態圖可以擁有一個或者多個終止狀態。
對象可以保持在終止狀態,但是終止狀態不可能有任何形式的觸發轉換,它的目的就是爲了激發封裝狀態上的完成轉換。


判定

活動圖和狀態圖中都有需要根據給定條件進行判斷,然後根據不同的判斷結果進行不同的轉換的情況。
實際就是工作流在此處按監護條件的取值發生分支,在UML中判定用空心菱形表示。

狀態圖的作用:

狀態圖的作用主要體現在以下幾個方面:    

(1)狀態圖清晰的描述了狀態之間的轉換順序,通過狀態的轉換順序也就可以清晰的看出事件的執行順序。如果沒有狀態圖我們就不可避免的要使用大量的文字來描述外部事件的合法順序。     

(2)清晰的事件順序有利於程序員在開發程序時避免出現事件錯序的情況。     

(3)狀態圖清晰的描述了狀態轉換時所必須的觸發事件、監護條件和動作等影響轉換的因素,有利於程序員避免程序中非法事件的進入。

(4)狀態圖通過判定可以更好的描述工作流因爲不同的條件發生的分支。

狀態圖的組成:

狀態圖的組成要素有狀態、轉換、事件、判定、同步。

狀態是狀態圖的重要組成部分,他描述了一個類對象生命週期中的一個時間段。

狀態可以分爲簡單狀態和組成狀態。簡單狀態指的是不包含其他狀態的狀態,簡單狀態沒有子結構,但是他可以具有內部轉換、進入動作、退出動作等。

除了簡單狀態和組成狀態外,狀態還包括狀態名、內部活動、內部轉換、入口和出口動作、歷史狀態。

內部活動:

狀態可以包含表達式的內部活動。當狀態浸入式活動在進入動作完成後就開始。如果活動結束,狀態就完成,然後一個從這個狀態出發的轉換被觸發,否則狀態等待出發轉換以引起狀態本身的改變。

歷史狀態(History States):

    歷史狀態是一個僞狀態(Pseudostate,其目的是記住從組合狀態中退出時所處的子狀態,當再次進入組合狀態,可直接進入這個子狀態,而不是再次從組合狀態的初態開始。

在上圖的狀態圖中,正常的狀態順序是:Washing- >Rinsing->Spinning】。

如果是從狀態【Rinsing】突然停電(Power Cut)退出,,洗衣機停止工作進入狀態【Power Off】,當電力恢復時直接進入狀態【Rinsing】。

轉換:

轉換用於表示一個狀態機的兩個狀態之間的一種關係,即一個在某初始狀態的對象通過執行指定的動作並符合一定的條件下進入第二種狀態。
在這個狀態的變化中,轉換被稱作激發。在激發之前的狀態叫做源狀態,在激發之後的狀態叫做目標狀態。簡單轉換隻有一個源狀態和一個目標狀態。複雜轉換有不止一個源狀態和(或)有不止一個目標狀態。

1.外部轉換

外部轉換是最普通最常見的一種轉換。如圖來看:

還是這張圖,登錄就是初始狀態,驗證是指定的動作,登錄成功是目標狀態。

2.內部轉換:

內部轉換隻有源狀態,沒有目標狀態,不會激發入口和出口動作,因此內部轉換激發的結果不改變本來的狀態。如果一個內部轉換帶有動作,它也要被執行。內部轉換常用於對不改變狀態的插入動作建立模型。要注意的是內部轉換的激發可能會掩蓋使用相同事件的外部轉換。

3.完成轉換:

完成轉換沒有明確標明觸發器事件的轉換是由狀態中活動的完成引起的。完成轉換也可以帶一個監護條件,這個監護條件在狀態中的活動完成時被賦值,而不是活動完成後被賦值。

4.監護條件:

轉換可能具有一個監護條件,監護條件是一個布爾表達式,它是觸發轉換必須滿足的條件。當一個觸發器事件被觸發時,監護條件被賦值。如果表達式的值爲真,轉換可以激發;如果表達式的值爲假,轉換不能激發;如果沒有轉換適合激發,事件會被忽略,這種情況並非錯誤。如果轉換沒有監護條件,監護條件就被認爲是真,而且一旦觸發器事件發生,轉換就激活。
從一個狀態引出的多個轉換可以有同樣的觸發器事件。若此事件發生,所有監護條件都被測試,測試的結果如果有超過一個的值爲真,也只有一個轉換會激發。如果沒有給定優先權,則選擇哪個轉換來激發是不確定的。

5.觸發器事件:

觸發器事件就是能夠引起狀態轉換的事件。如果此事件有參數,這些參數可以被轉換所用,也可以被監護條件和動作的表達式所用。觸發器事件可以是信號、調用和時間段等。
對應與觸發器事件,沒有明確的觸發器事件的轉換稱作結束轉換(或無觸發器轉換),是在結束時被狀態中的任一內部活動隱式觸發的。

6.動作:

動作(action)通常是一個簡短的計算處理過程或一組可執行語句。動作也可以是一個動作序列,即一系列簡單的動作。動作可以給另一個對象發送消息、調用一個操作、設置返回值、創建和銷燬對象。
動作是原子性的,所以動作是不可中斷的,動作和動作序列的執行不會被同時發生的其他動作影響或終止。動作的執行時間非常短,所以動作的執行過程不能再插入其他事件。如果在動作的執行期間接收到事件,那麼這些事件都會被保存,直到動作結束,這時事件一般已經得到值。

判定:

判定用來表示一個事件依據不同的監護條件有不同的影響。在實際建模的過程中,如果遇到需要使用判定的情況,通常用監護條件來覆蓋每種可能,使得一個事件的發生能保證觸發一個轉換。
判定在活動圖和狀態圖中都有很重要的作用。轉換路徑因爲判定而分爲多個分支,可以將一個分支的輸出部分與另外一個分支的輸入部分連接而組成一棵樹,樹的每個路徑代表一個不同的轉換。樹爲建模提供了很大的方便。
在活動圖中,判定可以覆蓋所有的可能,保證一些轉換被激發。否則,活動圖就會因爲輸出轉換不再重新激發而被凍結。

同步:

同步條是爲了說明併發工作流的分支與匯合。狀態圖和活動圖中都可能用到同步。在UML中,同步用一條線段來表示。    

事件:

在狀態機中,一個事件的出現可以觸發狀態的改變。它發生在時間和空間上的一點,沒有持續時間。如接受到從一個對象到另一個對象的調用或信號、某些值的改變或一個時間段的終結。
事件可以分成明確或隱含的幾種,主要包括:信號事件、調用事件、改變事件和時間事件等。

組成狀態:

1. 順序組成狀態

如果一個組成狀態的多個子狀態之間是互斥的,不能同時存在的,這種組成狀態稱爲順序組成狀態。
一個順序組成狀態最多可以有一個初始狀態和一個終態,同時也最多可以由一個淺(shallow)歷史狀態和一個深(deep)歷史狀態。

2.併發組成狀態:

在一個組成狀態中,可能有兩個或者多個併發的子狀態機,我們稱這樣的組成狀態爲併發組成狀態。每個併發子狀態還可以進一步分解爲順序組成狀態。
一個併發組成狀態可能沒有初始狀態,終態,或者歷史狀態。但是嵌套在它們裏的任何順序組成狀態可包含這些僞狀態。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章