一. PlantUML状态图 语法学习小结
1.简单状态
我们使用[*]
开始和结束状态图,使用-->
添加箭头。
@startuml [*] --> Test1 Test1 --> [*] Test1 : this is a test Test1 : this is another testTest1 -> Test2 Test2 --> [*] @enduml
2.更改状态渲染
我们使用隐藏空描述将状态呈现为简单状态。
@startuml hide empty description [*] --> Test1 Test1 --> [*] Test1 : this is a test Test1 : this is another testTest1 -> Test2 Test2 --> [*] @enduml
3.合成状态
一个状态也可能是合成的,但必须使用关键字state
和花括号来定义合成状态。
@startuml scale 350 width [*] --> NotShooting state NotShooting {[*] --> IdleIdle --> Configuring : EvConfigConfiguring --> Idle : EvConfig }state Configuring {[*] --> NewValueSelectionNewValueSelection --> NewValuePreview : EvNewValueNewValuePreview --> NewValueSelection : EvNewValueRejectedNewValuePreview --> NewValueSelection : EvNewValueSavedstate 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 long1long1 : Just a test[*] --> long1long1 --> long1 : New Datalong1 --> ProcessData : Enough Data } State3 --> State3 : Failed State3 --> [*] : Succeeded / Save Result State3 --> [*] : Aborted @enduml
5.并发状态
我们使用--
or ||
作为分隔符来合成并发状态。
@startuml [*] --> Activestate Active {[*] -> NumLockOffNumLockOff --> NumLockOn : EvNumLockPressedNumLockOn --> NumLockOff : EvNumLockPressed--[*] -> CapsLockOffCapsLockOff --> CapsLockOn : EvCapsLockPressedCapsLockOn --> CapsLockOff : EvCapsLockPressed--[*] -> ScrollLockOffScrollLockOff --> ScrollLockOn : EvCapsLockPressedScrollLockOn --> ScrollLockOff : EvCapsLockPressed }@enduml
二、例题巩固学习
1.以《电梯控制》系统、《银行账户》系统为例,分析系统中的状态及状态转换。
电梯状态机图:
电梯存在待载、上升、下降和楼间停4种基本状态。电梯无人承载时停在某楼层,处在待载状态。当有人进人电梯,并且当前楼层比目标楼层低,则电梯上升。如果当前楼层比目标楼层高,则电梯下降。在上升或下降状态,如果到了某个目标楼层,电梯运行停止,进人楼间停状态,等待人的进出。如果所有人都在本层下完,电梯回到待载状态。如果电梯中还有人,则判断目标楼层是否比当前楼层高,如果高于当前楼层则上升,如果低于当前楼层则下降。
银行账户状态机图:
银行账户存在空额有余额和负债三种状态。初建立的账户没有存款,处在空额状态。账户在空额状态时,如果向其中存款,进人有余额状态,如果从账户取款,则进人负债状态。账户在有余额状态时,如果向账户存款,余额增加,但仍然还在有余额状态。如果从账户取款,若取款额小于余额,账户仍在有余额状态;若取款额等于余额,则取款后账户回到空额状态;若取款额大于账户余额,则取款后账户进人负债状态。账户处于负债状态时,如果取款,余额减少,但仍然处在负债状态。如果给账户存款,当存款额小于负债额,则账户仍然在负债状态;如果存款额等于负债额,则存款后账户回到空额状态;如果存款额大于负债额,存款后账户进入有余额状态。
2.脚本及状态图
电梯控制:
@startuml
[*] --> 待载
待载 -up-> 上升 : 进入[目标楼层>当前楼层]/关门上行
上升 -down-> 楼间停 : [进人/出人]/停机开门
待载 -down-> 下降 : 进入[目标楼层<当前楼层]/关门下行
下降 -up-> 楼间停 : [进人/出人]/停机开门
楼间停 -up-> 上升:[目标楼层>当前楼层]/关门上行
楼间停 -down-> 下降:[目标楼层<当前楼层]/关门下行
楼间停 -left-> 待载:[无人]/关门
@enduml
银行账户
@startuml
[*] --> 空额
空额 -down-> 有余额 : 存款/余额=余额+存款额
空额 -down-> 负债 : 取款[取款额<最大限额]/余额=余额-存款额
有余额 --> 有余额 : 存款/余额=余额+存款额
有余额 --> 有余额 : 取款[取款额<余额]/余额=余额-取款额
有余额 -right-> 负债 : 取款[取款额>余额]/余额=余额-取款额
有余额 -up-> 空额 : 取款[取款额=余额]/余额=余额-取款额
负债 --> 负债 : 取款[取款额<最大限额]/余额=余额-存款额
负债 --> 负债 : 存款[存款额<负债额]/余额=余额+存款额
负债 -left-> 有余额 : 存款[存款额>负债额]/余额=余额+存款额
负债 -up-> 空额 : 存款[存款额=负债额]/余额=余额+存款额
空额 -up-> [*]
@enduml