利用狀態圖模擬響應系統,反應系統模型聲明周期,將靜態的業務可以動態流動起來,按照預定的狀態進行業務描述。
一、基本概念
狀態(state)是指在對象的生命期中的某個條件或狀況,在此期間對象將滿足某些條件、執行某些活動或等待某些事件。所有對象都具有狀態,狀態是對象執行了一系列活動的結果,當某個事件發生后,對象的狀態發生變化。
狀態圖(statechart diagram)用來描述一個特定的對象所有可能的狀態,以及由於各種事件的發生而引起的狀態之間的轉移和變化。並不是所有的類都需要畫狀態圖,有明確意義的狀態,在不同狀態下行為有所不同的類才需要畫狀態圖。
狀態機是計算機科學理論的一部分,但UML中的狀態機模型主要是基於David Harel所做的擴展,是用來展示狀態與狀態之間轉換的圖。
二、基本元素
1.狀態的組成部分
- 狀態名(name)
- 進入/退出動作(entry/exit action)
- 內部轉換(internal transition)
- 子狀態(substate)
- 延遲事件(defferred event)
2.狀態圖的要素
- 橢圓或圓角矩形:表示對象的一種狀態,橢圓內部填寫狀態名
- 箭頭:表示從箭頭出發的狀態可以轉換到箭頭指向的狀態
- 事件:引起狀態轉換的原因。事件名可在箭頭線上方標出
- 條件:事件名后加方括號,括號內寫狀態轉換條件
- 動作:轉換激活時的操作
- 實心圓:初始狀態
- 內部實心的同心圓:最終狀態
3.狀態的類型
①按狀態過程分:

一個狀態圖只能有一個初態,但終態可以有一個或多個,也可以沒有終態。
中間狀態包括兩個區域:名字域和內部轉移域,如圖所示。其中內部轉移域是可選的。

- entry/turnOn:當轉入該狀態時,做開燈動作。
- do/blinkFivetimes:當處於該狀態時,燈閃爍5次。do活動是只在狀態內出現的活動,不能附加到轉換上。
- event poweroff/powerSupplySelf:當電源關閉事件發生時,用自備電源。
- exit/turnOff:當轉出該狀態時,做關燈動作。
- event selfTest/defer:當selfTest事件發生時,對象將延遲響應,到別的狀態中再處理,用defer這個特定動作表示延遲。
②含有子狀態的狀態被稱為組合或嵌套狀態

組合狀態可以使用“與”關系分解為並發子狀態,或者通過“或”關系分解為互相排斥的順序子狀態。
- 順序子狀態:如果一個組成狀態的子狀態對應的對象在其生命期內的任何時刻都只能處於一個子狀態,即多個子狀態之間是互斥的,不能同時存在,這種子狀態稱為順序子狀態。

- 並發子狀態:有時組合狀態有兩個或者多個並發的子狀態機,此時稱組成狀態的子狀態為並發子狀態。

③歷史狀態是偽狀態, 其目的是記住從組合狀態中退出時所處的子狀態, 當再次進入組合狀態時, 可以直接進入這個子狀態, 而不是再從組合狀態的初態開始。
如下圖,running狀態被打斷到power on狀態,再轉回到running狀態時,希望直接進入歷史狀態
4.轉換(Transition)
轉換是兩個狀態間的一種關系,表示對象將在當前狀態中執行動作,並在某個特定事件發生或某個特定的條件滿足時進入后繼狀態。 每個轉換只允許有一個事件觸發,一個事件只允許有一個動作。
- 轉換的五要素:源狀態、目標狀態、觸發事件、監護條件和動作。(觸發事件:如果箭頭上不帶任何事件名,表示是一個自動轉換,當與源狀態相關的活動完成時就會自動觸發)。格式:觸發事件(參數)[條件]/動作
舉例:與狀態off相關的轉換有兩個,其觸發事件都是turnOn,只不過其監護條件不同。如果對象收到事件turnOn,那么將判斷壺中是否有水;如果[沒水],則仍然處於off狀態;如果[有水]則轉為on狀態,並執行“燒水”動作。而與狀態on相關的轉換也有兩個,如果“水開了”就執行turnOff,關掉開關;如果燒壞了,就進入了終態了。

- 轉換的類型
|
轉換類型
|
描述
|
語法
|
| 外部轉換 | 對事件做出響應,引起狀態變化或自身轉換,同時引發一個特定動作,如果離開或進入狀態將引發進入轉換、離開轉換 | 事件(參數)[監護條件]/動作 |
| 內部轉換 | 對事件做出響應,並執行一個特定的活動,但並不引起狀態變化或進入轉換、離開轉換 | 事件(參數)[監護條件]/動作 |
| 進入轉換 | 當進入某一狀態時,執行相應活動 | entry/活動 |
| 退出轉換 | 當離開某一狀態時,執行相應活動 | exit/活動 |
5.事件(Event)
事件是對一個時間和空間上占有一定位置的有意義的事情的規格說明。事件觸發狀態的轉移。
- 信號signer事件
對象之間通過發送信號和接收信號實現通信。信號是一種異步機制。在計算機中,鼠標和鍵盤的操作均屬於此類事件。對於一個信號而言,對象一般都有相應的事件處理器,如onMouseClick()等。
- ②調用call事件
表示一個操作的調度。一個對象請求調用另一個對象的操作信號是一個異步事件,而調用事件一般是同步的。也就是說,當對象調用另一對象的操作時,控制就從發送者傳送到接收者,該事件觸發轉換,完成操作后,接收者轉換到一個新的狀態,控制返還給發送者。
- 變化change事件
用關鍵字When,后面跟布爾表達式When(temperature>120)/alerm(),變化事件的意圖是要頻繁測試表達式,只要表達式由假變為真,事件就會發生。
- 時間time事件
時間事件是指在絕對時間或在某個時間間隔內發生的事情所引起的事件。例如到達某一時間或經過了某一時間段。用關鍵字When 或After表示。
6.狀態圖建模步驟:
①找出適合用模型描述其行為的類。
②確定對象可能存在的狀態。
③確定引起狀態轉換的事件。
④確定轉換進行時對象執行的相應動作。
⑤對建模的結果進行相應的精化和細化。
三、簡單案例
采樣點位狀態變更過程:初始狀態為待采樣,如果點位采集到了樣品,則變更點位狀態到已采樣,點位存在無法采樣情況,可以取消采樣,變更狀態到無效,點位存在當前不可以采樣,可以變更狀態到待補采,采集的樣品交接完畢,點位變更狀態到已完成,采樣活動結束。

至此,針對UML狀態圖的相關內容做了大概的總結,利用狀態圖,可以快速掌握具體對象的生命周期。
2020-02-06,望技術有成后能回來看見自己的腳步






