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
外部消息
@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