一、學習小結
1.簡單狀態:使用([*]
)開始和結束狀態圖;使用-->
添加箭頭。
@startuml [*] --> State1 State1 --> [*] State1 : this is a string State1 : this is another string State1 -> State2 State2 --> [*] @enduml
2.合成狀態:一個狀態也可能是合成的,必須使用關鍵字state
和花括號來定義合成狀態。
@startuml scale 350 width [*] --> NotShooting state NotShooting { [*] --> Idle Idle --> Configuring : EvConfig Configuring --> Idle : EvConfig } state Configuring { [*] --> NewValueSelection NewValueSelection --> NewValuePreview : EvNewValue NewValuePreview --> NewValueSelection : EvNewValueRejected NewValuePreview --> NewValueSelection : EvNewValueSaved state NewValuePreview { State1 -> State2 } } @enduml
3.長名字:使用關鍵字state
定義長名字狀態。
@startuml scale 600 width [*] -> State1 State1 --> State2 : Succeeded State1 --> [*] : Aborted State2 --> State3 : Succeeded State2 --> [*] : Aborted state State3 { state "Accumulate Enough Data\nLong State Name" as long1 long1 : Just a test [*] --> long1 long1 --> long1 : New Data long1 --> ProcessData : Enough Data } State3 --> State3 : Failed State3 --> [*] : Succeeded / Save Result State3 --> [*] : Aborted @enduml
4.並發狀態:用--
or||
作為分隔符來合成並發狀態。
@startuml [*] --> Active state Active { [*] -> NumLockOff NumLockOff --> NumLockOn : EvNumLockPressed NumLockOn --> NumLockOff : EvNumLockPressed -- [*] -> CapsLockOff CapsLockOff --> CapsLockOn : EvCapsLockPressed CapsLockOn --> CapsLockOff : EvCapsLockPressed -- [*] -> ScrollLockOff ScrollLockOff --> ScrollLockOn : EvCapsLockPressed ScrollLockOn --> ScrollLockOff : EvCapsLockPressed } @enduml
5.箭頭:
使用->
定義水平箭頭,也可以使用下列格式強制設置箭頭方向:
-down->
(default arrow)-right->
or->
-left->
-up->
- 可以用首字母縮寫或者開始的兩個字母定義方向(如,
-d-
,-down-
和-do-
是完全等價的)。 -
@startuml [*] -up-> First First -right-> Second Second --> Third Third -left-> Last @enduml
6.注釋:可以用 note left of
, note right of
, note top of
, note bottom of
關鍵字來定義注釋;還可以定義多行注釋;以及浮動注釋。
@startuml [*] --> Active Active --> Inactive note left of Active : this is a short\nnote note right of Inactive A note can also be defined on several lines end note @enduml
@startuml state foo note "This is a floating note" as N1 @enduml
7.更多注釋:可以在合成狀態中放置注釋。
@startuml [*] --> NotShooting state "Not Shooting State" as NotShooting { state "Idle mode" as Idle state "Configuring mode" as Configuring [*] --> Idle Idle --> Configuring : EvConfig Configuring --> Idle : EvConfig } note right of NotShooting : This is a note on a composite state @enduml
8.顯示參數:
用skinparam
改變字體和顏色。
可以在如下場景中使用:
還可以為狀態的構造類型指定特殊的字體和顏色。
@startuml skinparam backgroundColor LightYellow skinparam state { StartColor MediumBlue EndColor Red BackgroundColor Peru BackgroundColor<<Warning>> Olive BorderColor Gray FontName Impact } [*] --> NotShooting state "Not Shooting State" as NotShooting { state "Idle mode" as Idle <<Warning>> state "Configuring mode" as Configuring [*] --> Idle Idle --> Configuring : EvConfig Configuring --> Idle : EvConfig } NotShooting --> [*] @enduml
二、例題鞏固學習
1.以《電梯控制》系統、《銀行賬戶》系統為例,分析系統中的狀態及狀態轉換。
電梯狀態機圖:
電梯存在待載、上升、下降和樓間停4種基本狀態。電梯無人承載時停在某樓層,處在待載狀態。當有人進人電梯,並且當前樓層比目標樓層低,則電梯上升。如果當前樓層比目標樓層高,則電梯下降。在上升或下降狀態,如果到了某個目標樓層,電梯運行停止,進人樓間停狀態,等待人的進出。如果所有人都在本層下完,電梯回到待載狀態。如果電梯中還有人,則判斷目標樓層是否比當前樓層高,如果高於當前樓層則上升,如果低於當前樓層則下降。
銀行賬戶狀態機圖:
銀行賬戶存在空額有余額和負債三種狀態。初建立的賬戶沒有存款,處在空額狀態。賬戶在空額狀態時,如果向其中存款,進人有余額狀態,如果從賬戶取款,則進人負債狀態。賬戶在有余額狀態時,如果向賬戶存款,余額增加,但仍然還在有余額狀態。如果從賬戶取款,若取款額小於余額,賬戶仍在有余額狀態;若取款額等於余額,則取款后賬戶回到空額狀態;若取款額大於賬戶余額,則取款后賬戶進人負債狀態。賬戶處於負債狀態時,如果取款,余額減少,但仍然處在負債狀態。如果給賬戶存款,當存款額小於負債額,則賬戶仍然在負債狀態;如果存款額等於負債額,則存款后賬戶回到空額狀態;如果存款額大於負債額,存款后賬戶進入有余額狀態。
2.腳本及狀態圖
電梯控制:
@startuml
[*] --> 待載
待載 -up-> 上升 : 進入[目標樓層>當前樓層]/關門上行
上升 -down-> 樓間停 : [進人/出人]/停機開門
待載 -down-> 下降 : 進入[目標樓層<當前樓層]/關門下行
下降 -up-> 樓間停 : [進人/出人]/停機開門
樓間停 -up-> 上升:[目標樓層>當前樓層]/關門上行
樓間停 -down-> 下降:[目標樓層<當前樓層]/關門下行
樓間停 -left-> 待載:[無人]/關門
@enduml
銀行賬戶
@startuml
[*] --> 空額
空額 -down-> 有余額 : 存款/余額=余額+存款額
空額 -down-> 負債 : 取款[取款額<最大限額]/余額=余額-存款額
有余額 --> 有余額 : 存款/余額=余額+存款額
有余額 --> 有余額 : 取款[取款額<余額]/余額=余額-取款額
有余額 -right-> 負債 : 取款[取款額>余額]/余額=余額-取款額
有余額 -up-> 空額 : 取款[取款額=余額]/余額=余額-取款額
負債 --> 負債 : 取款[取款額<最大限額]/余額=余額-存款額
負債 --> 負債 : 存款[存款額<負債額]/余額=余額+存款額
負債 -left-> 有余額 : 存款[存款額>負債額]/余額=余額+存款額
負債 -up-> 空額 : 存款[存款額=負債額]/余額=余額+存款額
空額 -up-> [*]
@enduml