狀態機圖
基本概念: 狀態機圖,UML 1.x規范中稱狀態圖,是一個展示狀態機的圖。
狀態機圖基本上就是一個狀態機中元素的投影,這也就意味着狀態機圖包括狀態機的所有特征。狀態機圖顯示了一個對象如何根據當前狀態對不同事件做出反應的動態行為。
狀態機圖主要由狀態和轉換兩種元素組成。
狀態機
狀態機是一種行為,它說明對象在其生命周期中響應事件所經歷的狀態變化序列以及對那些時間的響應。
一般情況下,一個狀態機依附於一個類,用來描述這個類的實例的狀態及其轉換,和對接收到的事件所做出的響應。此外,狀態機也可以依附於用例、操作、協作等元素上,描述它們的執行過程。
狀態機從對象的初始狀態開始,響應事件並執行某些動作,從而引起狀態的轉換;在新狀態下又繼續響應事件並執行動作,如此循環進行到對象的終結狀態。
狀態機主要由狀態、轉換、事件、動作和活動5部分組成。
1)狀態表示對象的生命周期中的一種條件或情況。
2)轉換表示兩種狀態間的一種關系。
3)事件表示在某一時間與空間下所發生的有意義的事情。
4)動作表示一個可執行的原子操作,是UML能夠表達的最小計算單元
5)活動表示狀態機中的非原子執行,一般由一系列動作組成。

狀態機圖作用:狀態機圖用於對系統的動態方面進行建模,適合描述一個對象在其生命周期中的各種狀態及狀態的轉換。
狀態機圖的作用主要體現在以下幾點:
1)狀態機圖描述了狀態轉換時所需的觸發事件和監護條件等因素,有利於開發人員捕捉程序中需要的事件。
2)狀態機圖清楚地描述了狀態之間的轉換及其順序,這樣就可以方便地看出事件的執行順序,狀態機圖的使用節省了大量的描述文字。
3)清晰的事件順序有利於開發人員在開發程序時避免出現事件錯序的情況。
4)狀態機圖通過判定可以更好地描述工作流在不同的條件下而出現的分支。
狀態機圖的組成: 簡單狀態、轉換、偽狀態。
簡單狀態
狀態是狀態機圖的重要組成部分,它描述了一個對象穩定在的某一個持續過程或所處狀況,與動態行為的執行所產生的結果。
當對象滿足某一狀態的條件時,該狀態被稱為激活的。
在UML中,狀態分為簡單狀態與復合狀態。
a.簡單狀態就是沒有嵌套的狀態。
b.初態和終態是兩個特殊的狀態,分別表示狀態機的入口狀態和出口狀態。對於一個不含嵌套結構的狀態機,只能有一個初態,可以有一個或多個終態甚至沒有終態。

狀態一般由狀態名稱、子狀態、入口動作和出口動作、內部執行活動、內部轉換和可推遲事件組成。對於簡單狀態而言,不會有子狀態。
狀態名稱:可以把一個狀態與其他狀態分別開來,即狀態名稱必須在當前層次內保持唯一。沒有名稱的狀態被稱為匿名狀態。
入口動作與出口動作:由其它狀態轉移到當前狀態或從當前狀態轉移到其它狀態時要附帶完成的動作。表示為“entry /動作表達式”和“exit /動作表達式”。
內部執行活動:當對象進入一個狀態時,在執行完入口動作后就開始執行該活動。使用“do/活動表達式”來表示。
內部轉換:指的是不導致狀態改變的轉換。內部轉換只有源狀態而沒有目標狀態。表示為“事件名稱(事件參數)/活動表達式”。
可推遲事件:不會觸發狀態的轉換,且當對象處於該狀態時事件可能會被推遲,但不會丟失。格式為“事件名稱/defer”。
轉換
轉換是兩種狀態間的一種關系。它指明當特定事件發生或特定條件滿足時,處於某狀態(源狀態)的對象將執行某一動作或活動並進入另一狀態(目標狀態)。
轉換表示為從源狀態指向目標狀態的實線箭頭,並附有轉換的標簽。轉換的標簽格式如下:
⌊轉換名稱:⌋opt 事件名稱opt ⌊(參數列表)⌋opt ⌊[監護條件]⌋opt ⌊/效果列表⌋opt
轉換——轉換名
轉換名稱是轉換的標識符。在實際使用中,為了防止轉換名稱與轉換的觸發器或監護條件混淆,一般不必為轉換命名。
對於一個轉換,除了源狀態、目標狀態外,還要有事件、監護條件和效果列表等內容。這三個部分的內容對轉換不是必需的,在使用時要根據轉換所表達的具體語義來添加相應內容。
轉換——事件
事件是在某一時間與空間下所發生的有意義的事情,是系統執行中發生的值得建模的事物。
事件一般被狀態或轉換所發送和接收。在轉換中被接收的事件也被稱為該轉換的觸發器或觸發事件。
事件包含一個參數列表(可能為空),用於從事件的產生者向其接收者傳遞信息。
對應於觸發器轉換,沒有明確的觸發器的轉換成為結束轉換或無觸發器轉換,是在狀態的內部活動執行完畢后隱式觸發的。
能夠在觸發器中接收的事件有以下四種:
1)調用事件:調用事件表示對象接收到一個調用操作的請求。其期待的結果是事件的接收者觸發一個轉換並執行相應的操作。
2)改變事件:改變事件的發生依賴於事件中某個表達式所表達的布爾條件。改變事件沒有參數,要一直等到條件被滿足才能發生。
3)信號事件:信號由一個對象准確地送給另一個或一組對象。發送給一組對象的信號可能觸發每個對象的不同轉換。
4)時間事件:時間事件的發生依賴於事件中的一個時間表達式。比如,可以讓對象進入某狀態后經過一段給定的時間或到達某個絕對時間后發生該事件。

轉換——監護條件
監護條件是一個轉換被激發之前必須滿足的一個條件。
監護條件是一個布爾表達式,可以根據觸發器事件的參數、屬性和狀態機所描述的對象的鏈接等寫成。當轉換接收到觸發事件后,只有監護條件為真,轉換才能被激活。
對監護條件的檢驗是觸發器計算過程的一部分,對於每個事件監護條件只檢查一次。如果事件被處理時監護條件為假,那么除非再次接收到一個觸發事件,將不會再重新計算監護條件的值。
轉換——效果列表
效果列表是一個過程表達式,在轉換被激活時執行,表示轉換附加的效果。
效果列表包括多個動作,可以根據操作、屬性、擁有對象的連接、觸發器事件的參數等寫成。動作可以是一個賦值語句、算術運算、發送事件、調用對象的屬性或操作、創建或銷毀對象等。
效果的表達語法與其實現的具體內容有關。

例子(1):簡單的狀態機圖—吃飯狀態
做需求時,需要了解以下六種元素:起始、終止、現態、次態(目標狀態)、動作、條件,我們就可以完成一個狀態機圖了

①現態:是指當前所處的狀態。
②條件:又稱為“事件”,當一個條件被滿足,將會觸發一個動作,或者執行一次狀態的遷移。
③動作:條件滿足后執行的動作。動作執行完畢后,可以遷移到新的狀態,也可以仍舊保持原狀態。動作不是必需的,當條件滿足后,也可以不執行任何動作,直接遷移到新狀態。
④次態:條件滿足后要遷往的新狀態。“次態”是相對於“現態”而言的,“次態”一旦被激活,就轉變成新的“現態”了。
畫狀態機圖的注意事項:
1、避免把某個“程序動作”當作是一種“狀態”來處理。那么如何區分“動作”和“狀態”?“動作”是不穩定的,即使沒有條件的觸發,“動作”一旦執行完畢就結束了;而“狀態”是相對穩定的,如果沒有外部條件的觸發,一個狀態會一直持續下去。
2、狀態划分時漏掉一些狀態,導致跳轉邏輯不完整。所以在設計狀態機時,我們需要反復的查看設計的狀態圖或者狀態表,最終達到一種牢不可破的設計方案。
例子(2)需求崗工作狀態

偽狀態
概念:偽狀態指的是在狀態機中具有狀態的形式,卻具有特殊行為的頂點。
當一個偽狀態處於活動時,系統不會處理事件,而是瞬間自動轉換到另一個狀態,並且這種轉換是沒有事件進行顯式觸發的。
最常見的偽狀態包括初態、選擇、分叉與結合、歷史狀態等。
a.初態:初態實際上不是一個真正的狀態,它更像是狀態機的入口。初態的具體語義概念是模糊的且是瞬時的,不能存在觸發器進行觸發,否則對象將可能會長時間停留在一個語義不明的初態中。
b.選擇是狀態機中的一個偽狀態節點,用於表達狀態機中的分支結構。
一個選擇節點將一個轉換分割為兩個片段,即將觸發事件與監護條件分離。
選擇節點不同分支上的監護條件應該覆蓋所有情況,否則狀態機將不知道如何運行。

例子(3)訂單狀態機圖

復合狀態
概念:復合狀態是指包含有一個或多個嵌套狀態機的狀態。
a.順序復合狀態:當順序復合狀態被激活時,只有一個子狀態會被激活。
b.並發復合狀態:復合狀態中包括兩個或多個並發執行的子狀態機。
在復合狀態中,我們可以先將一部分細小的狀態組合成一個狀態機,把這個新的狀態機作為總狀態機圖中的一個復合狀態來呈現。
順序復合狀態
順序復合狀態又被稱為非正交狀態,是僅含一個狀態機的復合狀態。
當順序復合狀態被激活時,只有一個子狀態會被激活。它只增加了一層子結構,沒有增加額外的並發性。

並發復合狀態
並發復合狀態,也稱正交復合狀態,是包括兩個或多個並發執行的子狀態機的復合狀態。
並發復合狀態將復合狀態分成若干個正交區域,每個區域都有一個相對獨立的子狀態機。如果該並發復合狀態是激活的,那么該狀態中每個區域都將有一個狀態是激活的。

歷史狀態
歷史狀態是應用於復合狀態的一種偽狀態,它代表上次離開該復合狀態時的最后一個子狀態。
當一個來自於復合狀態外的轉換為復合狀態內的歷史狀態時,將使歷史狀態所記錄的子狀態被激活。
深歷史狀態保存的更深的嵌套層次中的子狀態。

狀態機圖的建模技術
為對象的生命周期建模
確定狀態機的語境。
設置狀態機的初態和終態。
決定該對象的狀態機中可能需要響應的事件。
從初態到終態,列出這個對象可能處於的所有頂層狀態。用轉移將這些狀態連接起來,明確轉移的觸發器和監護條件,接着向轉移中添加效果動作。
識別狀態是否需要有入口動作和出口動作。
如果需要,使用子狀態來對頂層狀態進行嵌套。
檢查狀態機中提供的事件是否與所期望的相匹配;檢查所有事件是否都已經被狀態機所處理。
檢查狀態機中的動作是否能由類或對象的關系、操作等支持。
跟蹤狀態機,確保狀態機是良構的,即不存在無法到達的狀態,也不會發生停機。
例子(4)音樂播放

例子(5)取消航班

例子(6)系統進程狀態機圖

案例
新生入學后,學校在三個月內按照國家招生規定對其進行復查。復查合格者予以注冊,取得學籍。復查不合格者,學校區別情況予以處理,直至取消入學資格。
學生有如下情況之一者,應予休學:
(一)因傷病經學校指定醫院診斷,須停課治療、休養一學期1/3時間;
(二)一學期請假缺課超過該學期總學時的1/3;
(三)傳染性肝炎、肺結核等傳染性疾病;
(四)因某種特殊原因,學校認為必須休學。
學生休學至少一學期,一般以一年為限。學生復學后,休學之前已記入成績檔案的考核成績繼續有效,並作為學籍處理依據.
學生復學按下列規定辦理:
(一)學生因傷病休學申請復學時,須持有二級甲等以上醫院診斷書,證明身體健康,並經學校指定醫院復查合格,方可復學;
(二)學生休學期滿后應於學期的注冊期內持有關證明,經教務處核准后編入原專業相應班級選課學習;
學生有下列情況之一者,應予退學:
(一)學生在讀期間,3次出現在一學期中取得的課程學分不足10學分(不含重修和補考學分;畢業學期除外;第一次提出警告,第二次提出退學警告,由教務處公布名單,院系負責通知學生家長);
(二)休學、保留學籍期滿,在規定期限內不辦理復學手續;
(三)休學累計滿二年,經復查不合格;
(四)因傷病需要休學,經學校動員后仍不辦理休學手續;
(五)經學校指定醫院確診患有疾病,或意外傷殘無法繼續在校學習;
(六)未請假離校連續2周末參加學校規定的教學活動;
(七) 超過學校規定期限未注冊而又無正當事由;
(八)本人要求退學。
學生在規定的學習年限(4年制3~6年,5年制4~7年)內修完本專業培養計划規定的全部教學環節,取得注冊專業規定的畢業學分,准予畢業,發給畢業證書。

狀態機圖
