一. PlantUML状态图 语法学习小结
1.简单状态
我们使用[*]
开始和结束状态图,使用-->
添加箭头。
@startuml
[*] --> Test1
Test1 --> [*]
Test1 : this is a test
Test1 : this is another test
Test1 -> Test2
Test2 --> [*]
@enduml
2.更改状态渲染
我们使用隐藏空描述将状态呈现为简单状态。
@startuml
hide empty description
[*] --> Test1
Test1 --> [*]
Test1 : this is a test
Test1 : this is another test
Test1 -> Test2
Test2 --> [*]
@enduml
3.合成状态
一个状态也可能是合成的,但必须使用关键字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
4.长名字
我们使用关键字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
5.并发状态
我们使用--
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
二. 电梯控制系统与银行账户系统的状态转换
(1)电梯控制
- 电梯存在四种基本状态,即:待载、上升、下降、楼间停;
- 电梯无人承载时停在某一楼层,处于待载状态;
- 当有人进入电梯,并且当前楼层比目标楼层低,电梯上升;
- 当有人进入电梯,并且当前楼层比目标楼层高,电梯下降;
- 当在某一层时电梯内所有人都离开电梯,电梯回到待载状态;
- 如果电梯中存在人,则执行2或3步骤。
- 电梯存在四种基本状态,即:待载、上升、下降、楼间停;
(2)银行账户
- 银行账户存在三种状态,即:空额、有余额、负债;
- 初建立的账户没有存款,处于空额状态;
- 若在空额状态时向账户存款,则进入有余额状态;若在空额状态时从账户取款,进入负债状态;
- 在有余额状态时向账户存款,余额增加,但还是处于有余额状态;
- 从账户中取款,若取款额小于余额,处于有余额状态;等于余额,回到空额状态;大于余额,进入负债状态;
- 负债时,取款则余额减少,仍处于负债状态;存款,当存款额小于负债额,还是负债;存款额等于负债额,回到空额状态;若存款额大于负债额,进入有余额状态。
三. 脚本程序
(1)电梯控制
@startuml [*] --> 待载 state 运行 { 待载 --> 上升 : 进入[目标楼层>当前楼层]/关门上行 上升 --> 楼间停 : [进人/出人]/停机开门 待载 --> 下降 : 进入[目标楼层<当前楼层]/关门下行 下降 --> 楼间停 : [进人/出人]/停机开门 楼间停 --> 上升:[目标楼层>当前楼层]/关门上行 楼间停 --> 下降:[目标楼层<当前楼层]/关门下行 楼间停 --> 待载:[无人]/关门 } @enduml
(2)银行账户
@startuml state 银行账户系统{ [*] --> 空额 空额 --> 有余额 : 存款/余额=余额+存款额 空额 --> 负债 : 取款[取款额<最大限额]/余额=余额-存款额 有余额 --> 有余额 : 存款/余额=余额+存款额 有余额 --> 有余额 : 取款[取款额<余额]/余额=余额-取款额 有余额 --> 负债 : 取款[取款额>余额]/余额=余额-取款额 有余额 --> 空额 : 取款[取款额=余额]/余额=余额-取款额 负债 --> 负债 : 取款[取款额<最大限额]/余额=余额-存款额 负债 --> 负债 : 存款[存款额<负债额]/余额=余额+存款额 负债 --> 有余额 : 存款[存款额>负债额]/余额=余额+存款额 负债 --> 空额 : 存款[存款额=负债额]/余额=余额+存款额 } @enduml
四. 状态图
(1)电梯控制
(2)银行账户