UML 序列图
序列图是仅次于类图的最常用 UML 图。 序列图将交互关系表示为一个二维图,纵向是时间轴,时间沿竖线向下延伸;横向轴代表了在协作中各个角色,一般是一个 Class 的对象,用一条虚线代表各角色的生命线,生命线上用矩形竖条表示是否处于活跃状态。对象之间可以发送同步或异步消息。
相对于类图,序列图可能更能体现 PlantUML 的价值
同步消息
@startuml
Alice -> Bob: Hi
Bob --> Alice: Hi
Alice -> Bob: Is this a pen?
Bob --> Alice: No! This is an apple!!
@enduml
- 序列图基本构成:
<角色> <消息类型> <角色> : <消息内容>
- 消息类型中
->
表示同步消息 -->
虚线表示返回消息
异步消息
@startuml
Alice ->> Bob: Hi
Alice ->> Bob: Is this a pen?
Alice ->> Bob: Is this a pen??
Alice ->> Bob: Is this a pen???
Alice ->> Bob: Is this a pen????
Bob -> Alice: This is an apple!!!
@enduml
-->
代表异步消息
角色生命线
@startuml
participant Alice
participant Bob
participant Carol
Carol -> Bob: Who is Alice?
Bob -> Alice: Are you Alice?
@enduml
- 多个
participant
会按照从左往右的顺序显示各角色生命线 - 如果没有任何
participant
, 则会角色出现的顺序显示从左往右显示其生命线
角色图例
@startuml
actor Actor
boundary Boundary
control Control
entity Entity
database Database
collections Collections
@enduml
除了 participant
之外, 使用其他关键字可以表示特殊的角色类型
发给自己的消息
@startuml
Aclie -> Aclie: do something by yourself
Aclie -> Aclie: do something by yourself
Aclie -> Aclie: do something by yourself
Aclie -> Aclie: do something by yourself
@enduml
消息序号
@startuml
Alice -> Bob: Hi
autonumber
Bob -> Carol: Hi
Carol -> Dave: Hi
Bob -> Dave: Hi
@enduml
有时候需要为消息添加序号以表示顺序,可以在第一个消息前添加 autonumber
,后续消息自动添加序号。
起始序号与增量
@startuml
autonumber 3
Alice -> Bob: Hi
Bob -> Carol: Hi
autonumber 2 3
Carol -> Dave: Hi
Bob -> Dave: Hi
@enduml
autonumber <开始序号> <增量>
用来指定其实序号和序号递增的增量
消息序号暂停
@startuml
autonumber
Alice -> Bob: Hi
autonumber stop
Bob -> Carol: Hi
Carol -> Dave: Hi
autonumber resume
Bob -> Dave: Hi
Carol -> Dave: Hi
@enduml
- autonumber stop: 自动序号暂停
- autonumber resume: 自动序号继续
消息组
@startuml
Alice -> Bob: Is this a pen?
alt yes
Alice <-- Bob: Yes! This is a pen!!
else no
Alice <-- Bob: No! This is an apple!!!!!
end
@enduml
有时候需要多个消息表示一组相关的逻辑,此时可以使用预置的关键字来表示各种逻辑,例如
- alt/else
- opt
- loop
- par
- break
- critical
- 关键词之后添加表示逻辑的文字,例如 yes, no等
- 消息信息的缩进不是必须的,但是加上可读性更好
消息组嵌套
消息组内可以嵌套其他消息组,如下:
@startuml
Alice -> Bob: Is this a pen?
alt yes
Alice <-- Bob: Yes! This is a pen!!
else no
Alice <-- Bob: Noooooooo! This is an apple!!!!!
loop ∞
Alice -> Bob: Oh sorry! By the way, is this a pen?
Alice <-- Bob: No!!!!
end
end
@enduml
自定义消息组
除了使用预置关键字的消息组,还可以使用任意名字自定义一个消息组
@startuml
group copy
Alice -> Bob: Is this a pen?
Alice <-- Bob: No! This is an apple!!
end
@enduml
group
之后添加消息组的名字
生命线活跃状态
@startuml
activate Alice
Alice -> Bob
activate Bob
Bob -> Carol
activate Carol
Bob <-- Carol
deactivate Carol
Alice <-- Bob
deactivate Bob
@enduml
activate <name>
指定name的生命线进入活跃状态deactive <name>
指定name的生命线退出活跃状态
嵌套活跃状态
@startuml
activate Alice
Alice -> Bob
activate Bob
Bob -> Bob
activate Bob
Bob -> Carol
activate Carol
Bob <-- Carol
deactivate Carol
Alice <-- Bob
deactivate Bob
@enduml
activate
中继续 activate
可以嵌套活跃状态
创建角色和生命线
@startuml
Alice -> Bob
create Carol
Bob -> Carol: new
Bob -> Carol
Bob <-- Carol
Alice <-- Bob
@enduml
create <name>
用来创建一个角色和其生命线,此时消息箭头会执行角色图例
参考、引用
@startuml
Alice -> Bob
ref over Bob, Carol: ...
Alice <-- Bob
ref over Alice
...
...
end ref
@enduml
可以在时序图中添加参考信息
ref over <生命线名称> : <内容>
: reference 的范围和参考内容ref over ... end ref
: 可以换行写参考内容
边界线
@startuml
== Foo ==
Alice -> Bob
Alice <-- Bob
== Bar ==
Bob -> Carol
Bob <-- Carol
@enduml
== <name> ==
添加边界线,跨越所有角色的生命线
外部消息
@startuml
[-> Alice: Hello
Alice ->]: Hello
@enduml
消息箭头的前后使用 [
, ]
,表示一个来自外部或者指向外部的消息
消息间隔
@startuml
Alice -> Bob
Alice <-- Bob
Alice -> Bob
Alice <-- Bob
|||
Alice -> Bob
Alice <-- Bob
||80||
Alice -> Bob
Alice <-- Bob
@enduml
- 消息之间加
|||
, 会适当拉开消息间隔 ||<pixel>||
:pixel可以指定具体间隔的像素数
备注
@startuml
Alice -> Bob
note left: Hello
Alice <-- Bob
note right: World
Alice -> Alice
note left
Hello
World
end note
@enduml
- 消息后紧跟
note left
或者note right
表示在相应位置添加备注,注意note 不能指定 top 或 bottom note <left|right> ... end note
可以换行写备注- 备注内容支持 Creole 格式,Creole 的语法类似 Markdown
Creole 语法示例
@startuml
note left
--标题--
= 标题1
== 标题2
=== 标题3
--列表--
* 列表1
* 列表2
** 列表2-1
# 有序列表1
# 有序列表2
## 有序列表2-1
--字体--
* **粗体**
* //斜体//
* ""等宽字体(monospace)""
* --删除线--
* __下划线__
--表格--
|= |= Column1 |= Column2 |
|1 |Value1-1 |Value1-2 |
|2 |Value2-1 |Value2-2 |
--HTML--
* <color:red>设置颜色</color>
* <color:#00FF00>色号</color>
* <back:skyblue>背景色</back>
* <size:18>字号</size>
* <b>粗体</b>
--目录--
|_build.gradle
|_src
|_main
|_java
|_...
|_...
|_test
end note
@enduml