第一部分:狀態圖語法
(1)簡單狀態:使用([*]
)開始和結束狀態圖。使用-->
添加箭頭。
1 @startuml 2 3 [*] --> State1 4 State1 --> [*] 5 State1 : this is a string 6 State1 : this is another string 7 8 State1 -> State2 9 State2 --> [*] 10 11 @enduml
(2)合成狀態:一個狀態也可能是合成的,必須使用關鍵字state
和花括號來定義合成狀態。
1 @startuml 2 scale 350 width 3 [*] --> NotShooting 4 5 state NotShooting { 6 [*] --> Idle 7 Idle --> Configuring : EvConfig 8 Configuring --> Idle : EvConfig 9 } 10 11 state Configuring { 12 [*] --> NewValueSelection 13 NewValueSelection --> NewValuePreview : EvNewValue 14 NewValuePreview --> NewValueSelection : EvNewValueRejected 15 NewValuePreview --> NewValueSelection : EvNewValueSaved 16 17 state NewValuePreview { 18 State1 -> State2 19 } 20 21 } 22 @enduml
(3)長名字:也可以使用關鍵字state
定義長名字狀態。
1 @startuml 2 scale 600 width 3 4 [*] -> State1 5 State1 --> State2 : Succeeded 6 State1 --> [*] : Aborted 7 State2 --> State3 : Succeeded 8 State2 --> [*] : Aborted 9 state State3 { 10 state "Accumulate Enough Data\nLong State Name" as long1 11 long1 : Just a test 12 [*] --> long1 13 long1 --> long1 : New Data 14 long1 --> ProcessData : Enough Data 15 } 16 State3 --> State3 : Failed 17 State3 --> [*] : Succeeded / Save Result 18 State3 --> [*] : Aborted 19 20 @enduml
(4)並發狀態:用--
or ||
作為分隔符來合成並發狀態。
1 @startuml 2 [*] --> Active 3 4 state Active { 5 [*] -> NumLockOff 6 NumLockOff --> NumLockOn : EvNumLockPressed 7 NumLockOn --> NumLockOff : EvNumLockPressed 8 -- 9 [*] -> CapsLockOff 10 CapsLockOff --> CapsLockOn : EvCapsLockPressed 11 CapsLockOn --> CapsLockOff : EvCapsLockPressed 12 -- 13 [*] -> ScrollLockOff 14 ScrollLockOff --> ScrollLockOn : EvCapsLockPressed 15 ScrollLockOn --> ScrollLockOff : EvCapsLockPressed 16 } 17 18 @enduml
(5)箭頭方向:
使用->
定義水平箭頭,也可以使用下列格式強制設置箭頭方向:
-down->
(default arrow)-right->
or->
-left->
-up->
@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
(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
第二部分:分析電梯運行、銀行賬戶的狀態轉換
①電梯運行
- 電梯有待載、上升、下降、和樓間停4鍾基本狀態。
- 電梯無人承載時停在某一樓層,處在待載狀態。
- 有人進入電梯,並且當前樓層比目標樓層低,電梯上升。
- 反之電梯下降。
- 所有人在本層下電梯,電梯待載狀態。
- 電梯中還有人則判斷樓層,高於當前樓層則上升,反之下降。
②銀行賬戶
- 銀行賬戶存在空額、有余額、負債三種狀態。
- 初次建立賬戶為空額。
- 向其中存款,有余額狀態。
- 從賬戶中取款,進入負債狀態。
- 有余額狀態存款,余額增加,有余額狀態。
- 從賬戶中取款,取款額小於余額,有余額狀態。
- 取款額大於余額,負債狀態。
- 取款額等於余額,空額狀態。
- 負債狀態時取款,負債狀態。
- 負債狀態存款,存款額小於負債額,負債狀態。
- 存款額對於負債額,空額狀態。
- 存款額大於負債額,有余額狀態。
第三部分:《電梯控制》系統、《銀行賬戶》系統狀態轉換的腳本程序
①電梯運行
1 @startuml 2 [*] --> 待載 3 4 待載 -> 上升:進入[目標樓層>當前樓層]/關門上行 5 待載 -> 下降:進入[目標樓層<當前樓層]/關門下行 6 7 上升 --> 樓間停:[進人/出人]/停機開門 8 下降 --> 樓間停:[進人/出人]/停機開門 9 10 樓間停 --> 上升:[目標樓層>當前樓層]/關門上行 11 樓間停 --> 下降:[目標樓層<當前樓層]/關門下行 12 樓間停 --> 待載:[無人]/關門 13 @enduml
②銀行賬戶
1 @startuml 2 [*] -> 空額 3 空額 -> [*] 4 5 空額 --> 有余額:存款/余額=余額+存款額 6 空額 --> 負債:取款[取款額<最大限額]/余額=余額-存款額 7 8 有余額 -> 有余額:存款/余額=余額+存款額 9 有余額 -> 有余額:取款[取款額<余額]/余額=余額-取款額 10 有余額 --> 負債:取款[取款額>余額]/余額=余額-取款額 11 有余額 --> 空額:取款[取款額=余額]/余額=余額-取款額 12 13 負債 -> 負債:取款[取款額<最大限額]/余額=余額-存款額 14 負債 -> 負債:存款[存款額<ABS(余額)]/余額=余額+存款額 15 負債 --> 有余額:存款[存款額>ABS(余額)]/余額=余額+存款額 16 負債 --> 空額:存款[存款額=ABS(余額)]/余額=余額+存款額 17 @enduml