狀態機圖
狀態機圖對一個單獨對象的行為建模,指明對象在它的整個生命周期里,響應不同事件時,執行相關事件的順序。
如下示例, 下列的狀態機圖顯示了門在它的整個生命周期里如何運作。
門可以處於以下的三種狀態之一: "Opened"打開狀態, "Closed"關閉狀態,或者"Locked"鎖定狀態。 它分別響應事件:"Open"開門, "Close"關門, "Lock"鎖門 和 "Unlock"解鎖。 注意:不是所有的事件,在所有的狀態下都是有效的。如:一個門打開的時候是不可能鎖定的,除非你關上門。並且,狀態轉移可能有附加監護條件:假設門是開的,如果"doorWay->isEmpty"(門是空的)被滿足,那么它只能響應關門事件。狀態機圖使用的語法和約定將在下面的部分進行討論。
狀態
狀態被表示為圓角矩形,狀態名寫在里面。
起始和結束狀態
初始狀態表示為實心黑圓環,可以標注名稱。結束狀態表示為中心帶黑點圓環,也可以被標注名稱。
轉移
一個狀態到下一個狀態的轉移表示為帶箭頭實線。轉移可以有一個"Trigger"觸發器,一個"Guard"監護條件和一個"effect"效果。如下所示:
"Trigger"觸發器是轉移的起因,它可以是某個條件下的一個信號,一個事件,一個變化或一個時間通路。"Guard"監護是一個條件,而且必須為真,以便於讓觸發器引起轉移。效果"Effect"是直接作用到對象上的一個動作,該對象具有做為轉移結果的狀態機。
狀態活動
在上面的狀態轉移示例中,一個效果與該轉移相關聯。如果目標狀態有多個轉移到達,並且每一個轉移都有相同的效果與它相關聯,那最好將該效果與目標狀態相關聯,而不與轉移相關聯。你可以通過為這個狀態定義初始動作來實現。下圖顯示了一個帶入口動作和出口動作的狀態。
可以定義發生在事件上的動作或一直發生的動作。每一種類型的動作是可以定義任意數量的。
自轉移
一個狀態可能有一個返回到自身的轉移,如下圖。效果與轉移關聯是十分有幫助。
復合狀態
一個狀態機圖可以有子狀態機圖,如下圖所示:
可選擇不同方式顯示相同信息,如下圖所示:
上面版本的標注說明"Check PIN"的子狀態機圖顯示在單獨的圖中。
入口點
有時,你不想在正常的初始狀態進入子狀態機。例如下面的子狀態機,它通常從"初始化"狀態開始,但是如果因為某些原因,它不必執行初始化,可能靠轉移到指定的入口點來從 "Ready" 狀態開始。
下圖顯示了狀態機的上一層。
出口點
有與入口點相類似的方式,它可能也指定可選擇的出口點。下圖給出了主處理狀態執行后,所執行狀態的去向將取決於該狀態轉移時所使用的路徑。
選擇偽狀態
選擇偽狀態顯示為菱形,有一個轉移輸入,兩個或多個輸出。下圖顯示不管到達哪一個狀態,經過選擇偽狀態后的去向,取決於在偽狀態中執行時所選擇的消息格式。
連接偽狀態
連接偽狀態用來將多個狀態轉移鏈接在一起。一個單獨的連接偽狀態可以有一個或多個輸入和一個或多個輸出,監護可能應用於每一個轉移,連接是沒有語義的。連接可以把一個輸入轉移分成多個輸出轉移來實現一個靜態分支。與之對照的是選擇偽狀態實現一個動態條件分支。
終止偽狀態
進入終止偽狀態是指狀態機生命線已經終止。終止偽狀態表示為叉號。
歷史狀態
歷史狀態用來當狀態機中斷時,恢復狀態機之前狀態。下面例圖說明了歷史狀態的使用。這個例子是關於洗衣機的狀態機。
在這個狀態機中,當洗衣機運行時,它會按照"Washing" 到Rinsing"再到"Spinning"來進行。如果電源被切斷 ,洗衣機會停止運行並進入"Power Off" 狀態。當電源恢復,運行狀態在"History State"符號處進入,表示它會從上次離開的地方恢復。
並發區
一個狀態可以被分成幾個不同的區,包含同時存在和執行的子狀態。下面的例子顯示狀態 "Applying Brakes", "front brake"和"rear brakes" 將同時獨立運作。注意使用了分叉和結合偽狀態而不是選擇和合並偽狀態。這些符號用來同步並發的線程。