目录
时序图有时候也被称为序列图,活动序列图,作为交互图的一种,时序图按照时间顺序从上往下显示每个操作。
我们以一个日常生活中常见的操作,在ATM上查询银行卡账户余额,首先用户先将银行卡插入读卡器,然后在屏幕上输入密码,如果密码错误则回提示重新输入密码,如果密码正确则会收到一条登陆ATM的提示短信。我们根据这个流程怎么绘制时序图呢?我们就看看下图:

在这幅图中,垂直的虚线叫做参与者的生面线,表示一个对象的存活时间。每个箭头都表示一个调用。我们在了解时序图以后,我们看看如何使用PlantUML 绘制时序图。
idea->preferences->plugin;在marketplace中搜索PlanUML Integration, 进行安装;安装后我们就可在idea中新建一个PlantUML 文件,图下图所示


上文中ATM的时序图就是使用PlantUML绘制的,plantUML 文件是以 @startuml 开头, 以 @enduml结尾,如下所示:
@startuml 'https://plantuml.com/sequence-diagram title 时序图示例 header @author chenxiu footer page @author chenxiu skinparam roundcorner 20 skinparam sequenceParticipant underline skinparam LifeLineBackgroundColor #lightYellow hide footbox actor User as user #green box ATM control 屏幕 as app #lightBlue participant 读卡器 as reader #yellow end box box BANK #lightBlue participant service entity 短信 queue MessageQueue database Mysql activate user user->reader #lightBlue:插如银行卡 activate reader reader-> reader:读卡 activate reader deactivate reader reader->app:显示屏幕 deactivate reader activate app app ->user:提示输入密码 deactivate app user->app:输入密码 activate app app-> service:查询用户 activate service service->Mysql:查询用户 activate Mysql Mysql ->service:resultSet deactivate Mysql alt 用户存在 service ->> MessageQueue:发送登陆ATM消息 activate MessageQueue note over MessageQueue #red:通过消息队列消峰 ...30秒... MessageQueue ->短信:发送短信 activate 短信 短信 -->user deactivate 短信 deactivate MessageQueue service ->app:服务选项 app -> user :提示选择服务 else 用户不存在 ||| service->app:登陆失败 deactivate service app-> user:重新输入密码 deactivate app end @enduml 通过上文的DEMO,我们逐步来分析时序图的内容
在时序图中使用 a -> b绘制两个参与者之间的关系,a,b 都是参与者,不必明确声明.但是如果需要对参与者进行更多的控制就需要声明参与者,在PlantUML 中支持其中参与者
| 参与者 | 含义 |
| participant | 参与者 |
| actor | 角色 |
| boundary | 边界 |
| control | 控制 |
| entity | 实体 |
| database | 数据库 |
| collections | 集合 |
| queue | 队列 |
各个参与者的效果如下图所示:

可以使用 as 关键字给参与者取别名,也可以针对参与者使用多行定义,具体代码示例如下:
- @startuml
- 'https://plantuml.com/sequence-diagram
-
- '使用 as 关键字对参与者Actor取别名 user,在后续的代码中可以直接使用别名'
- actor Actor as user
- participant Participant
- participant 多行参与者 [
- =标题
- ----
- 副标题
- ]
-
- control Control
-
- boundary Boundary
-
- entity Entity
-
- collections Collections
-
- queue Queue
-
- database Database
-
- user->Participant
- user->多行参与者
- user->Control
- user->Boundary
- user->Entity
- user -> Collections
- user->Queue
- user->Database
-
- @enduml
在代码中使用 ‘注释’ 针对代码进行注释,在UML中使用如下语句添加注释
note right: this is another note note left: this is another note note over Alice: This is displayed over Alice.
可以通过以下关键字来组合消息
| 关键字 | 含义 |
| alt/else/end | if..else |
| loop/end | 循环 |
| par/end | 常态 |
| break/end | 中断条件 |
| critical/end | 条件 |
| group | 分组 |
| opt | 可选项 |
代码示例
- @startuml
- 'https://plantuml.com/sequence-diagram
-
- A ->B
- alt success
- B-> C
- opt 可选逻辑
- C-->D
- end
- par 正常场景
- C-->D
- end
- critical input==1
- C-->E
- end
- break input <=0
- E ->C
- end
-
- group 分组说明 [second]
- loop 100次
- B->B:自旋
- end
- end
- C -->A
- |||
- else fail
- |||
- B--> A
-
- end
-
- @enduml

在PlantUML 中很多元素都是可以修改颜色的,下面我们分别来看看修改颜色
| 说明 | 语法示例 |
| 修改参与者颜色 | participant Participant #blue |
| 改变箭头颜色 | user -[#blue]> Participant |
| 改变消息颜色 | user -> participant:<font color=red> requestg |
| 改变生面线颜色 | 控制器 ->alice #lightyellow:认证失败 |
| 修改注释颜色 | note over Alice, Bob #FFAAAA: This is displayed\n over Bob and Alice.
|
| 修改背景颜色 | skinparam backgroundColor #EEEBDCm |
可以在时序图中添加锚点,进而指定持续时间
- @startuml
- !pragma teoz true
-
- {start} Alice -> Bob : start doing things during duration
- Bob -> Max : something
- Max -> Bob : something else
- {end} Bob -> Alice : finish
-
- {start} <-> {end} : some time
- @enduml
| 说明 | 语法 | 备注 |
| 标题 | title 时序图示例 | |
| 页头 | header 我是页头 | |
| 页脚 | footer page 1/2 | |
| 开启自动序号 | autonumber | |
| 隐藏脚注 | hide footbox | |
| 延迟 | ... 五分钟后 ... | |
| 分页 | newpage | |
| 分割 | == 分割 == | |
| 激活生命线 | activate | |
| 撤销生命线 | deactivate | |
| 终结生命线 | destory | |
| 自动激活生命线 | autoactivate /return | |
| 创建对象 | create | |
| 包裹参与者 | box/end box | 可以使用box, end box 将多个声明参与者包围在一起 |
| 隐藏孤立的参与者 | hide unlinked |
参考资料: