markdown工具链plantuml:像写代码一样绘制 UML 模型-时列图
markdown工具链plantuml:像写代码一样绘制 UML 模型-时列图
概述
序列图具有直观、形象的特点,对于理清、呈现对象之间的交互关系非常有帮助。在UML建模中,时序图中包括的建模元素主要有:对象(Actor)、生命线(Lifeline)、控制焦点(Focus of control)、消息(Message)等。
- 角色: 可以是人或者系统;
- 对象:指系统中某个模块、类、类的实例等,对象的命名包含三种方式:1)
对象:类名
;2):类名
;3)对象名
。通常,为作图清晰,对象的排列遵循以下两个原则:1)把交互频繁的对象尽可能的靠拢;2)把初始化整个交互活动的对象放置在最左端; - 生命线:从对象图标向下延伸的一条虚线,表示对象存在的时间;
- 控制焦点:又称为激活期,表示时间段的符号,在这个时间段内对象将执行相应的操作。它可以被理解成C语言语义中一对花括号
{ }
中的内容;用小矩形表示; - 消息:用于对象间传递信息,消息代表的是责任分配而不是数据流动,消息名称中不用带“请求二次”,因为消息箭头已经包含有请求的意思。例如,A指向B是指A调用B做某事,做某事是B的一个责任。消息可分为:
- 1)同步消息(Synchronous Message):又称调用消息,消息的发送者把控制传递给消息的接收者,然后停止活动,等待消息的接收者放弃或者返回控制。用来表示同步的意义;
- 2)异步消息(Asynchronous Message):消息发送者通过消息把信号传递给消息的接收者,然后继续自己的活动,不等待接受者返回消息或者控制。异步消息的接收者和发送者是并发工作的;
- 3)返回消息(Return Message): 返回消息表示从过程调用返回;
- 4)自关联消息(Self-Message): 表示方法的自身调用以及一个对象内的一个方法调用另外一个方法。
上述各个建模元素使用 plantuml 语言示意如下:
@startuml
actor 角色
activate 对象1
角色 -> 对象1
对象1 -> 对象2 : 同步消息
对象2 --> 对象1 : 返回消息1
对象1 o-> 对象2 : 异步消息
对象1 -> 对象1 : 自关联消息
@enduml
一般异步消息开始点使用圆圈表示
角色、对象(参与者)
UML中, 角色可以是人或者系统;对象 指系统中某个模块、类、类的实例等,对象的命名包含三种方式:1)对象:类名
;2):类名
;3)对象名
。通常,为作图清晰,对象的排列遵循以下两个原则:1)把交互频繁的对象尽可能的靠拢;2)把初始化整个交互活动的对象放置在最左端;
UML角色与对象在 plantuml 中都是参与者。
声明参与者
plantuml 使用如下关键字actor, boundary, control, entity, database
声明参与者:
@startuml
actor actor
boundary boundary
control control
entity entity
database database
@enduml
- 可以使用
<<
和>>
给参与者添加构造类型。在构造类型中,可以使用(X,color)
格式的语法添加一个圆圈圈起来的字符; - 可以使用
participant
改变参与者的先后顺序与颜色。 - 可以使用引号定义参与者,此时参与者可以使用特殊字符。
@startuml
participant A << (C,#ADD1B2) Test >> order 2 #red
participant B order 1 #99ff99
A -> B
B -> "C()" : 测试
@enduml
order 值越小,越靠前。
包裹参与者
plantuml 可以使用 box
和 end box
画一个盒子将参与者包裹起来。 还可以在 box 关键字之后添加标题或者背景颜色。
@startumlA
box "帖子管理" #LightBlue
participant 添帖模块
participant 查询模块
end box
participant 数据库
添帖模块 -> 查询模块 : 查询帖子
查询模块 -> 数据库 : 查询数据库
@enduml
外观参数
plantuml 用 skinparam
改变字体和颜色。
可以在如下场景中使用:
- 在图示的定义中,
- 在引入的文件中,
- 在命令行或者ANT任务提供的配置文件中。
@startuml
skinparam backgroundColor #EEEBDC
skinparam handwritten true
skinparam sequence {
ArrowColor DeepSkyBlue
ActorBorderColor DeepSkyBlue
LifeLineBorderColor blue
LifeLineBackgroundColor #A9DCDF
ParticipantBorderColor DeepSkyBlue
ParticipantBackgroundColor DodgerBlue
ParticipantFontName Impact
ParticipantFontSize 17
ParticipantFontColor #A9DCDF
ActorBackgroundColor aqua
ActorFontColor DeepSkyBlue
ActorFontSize 17
ActorFontName Aapex
}
box "帖子管理" #LightBlue
participant 添帖模块
participant 查询模块
end box
participant 数据库
添帖模块 -> 查询模块 : 查询帖子
查询模块 -> 数据库 : 查询数据库
@enduml
生命线
UML 中,生命线是从对象图标向下延伸的一条虚线,表示对象存在的时间。
时延与空间
在 plantuml 中,可以使用...
来表示延迟,并且可以给延迟添加注释;可以使用 |||
来增加空间。可以使用数字指定增加的像素的数量。
@startuml
帖子管理模块 -> 数据库: 认证请求
...
帖子管理模块 <-- 数据库: 返回码
...5 分钟后...
数据库 <- 帖子管理模块 : 断开连接
||45||
数据库 --> 帖子管理模块 : 再见
@enduml
控制焦点(激活期)
控制焦点,又称为激活期,表示时间段的符号,在这个时间段内对象将执行相应的操作。它可以被理解成C语言语义中一对花括号{ }
中的内容;用小矩形表示;
在plantuml中,关键字 activate
用来表示参与者的生命活动,一旦参与者被激活,就进入激活期。使用 deactivate
退出生命期。
还可以使用嵌套的生命线,并且运行给生命线添加颜色。可以使用destroy
销毁生命线。
@startuml
participant 用户
用户 -> 帖子管理模块: 发帖
activate 帖子管理模块 #FFBBBB
帖子管理模块 -> 帖子管理模块: 内部调用
activate 帖子管理模块 #DarkSalmon
帖子管理模块 o-> 数据库: << 创建表项 >>
activate 数据库
deactivate 帖子管理模块
数据库 --> 帖子管理模块: 返回码
destroy 数据库
@enduml
消息
UML序列图中,消息用于对象间传递信息,消息代表的是责任分配而不是数据流动,消息名称中不用带“请求二次”,因为消息箭头已经包含有请求的意思。例如,A指向B是指A调用B做某事,做某事是B的一个责任。消息可分为:
- 1)同步消息(Synchronous Message):又称调用消息,消息的发送者把控制传递给消息的接收者,然后停止活动,等待消息的接收者放弃或者返回控制。用来表示同步的意义;
- 2)异步消息(Asynchronous Message):消息发送者通过消息把信号传递给消息的接收者,然后继续自己的活动,不等待接受者返回消息或者控制。异步消息的接收者和发送者是并发工作的;
- 3)返回消息(Return Message): 返回消息表示从过程调用返回;
- 4)自关联消息(Self-Message): 表示方法的自身调用以及一个对象内的一个方法调用另外一个方法。
进入和发出消息
在 plantuml 中,如果只想关注部分图示,你可以使用进入和发出箭头。 使用方括号 [
和]
表示图示的左、右两侧。
@startuml
[-> 帖子管理 : 发帖
帖子管理 ->] : 删除某个表项
帖子管理 <--] : 错误码
@enduml
箭头
在 plantuml 中,可以修改箭头的样式、颜色。
1. 修改箭头样式的方式有以下几种:
- 表示一条丢失的消息,末尾加
x
; - 让箭头只有上半部分或者下半部分:将
<
和>
替换成\
或者/
; - 细箭头:将箭头标记写两次 (
如 >> 或 //
) ; - 虚线箭头:用
--
替代-
; - 箭头末尾加圈:
->o
; - 双向箭头:
<->
。
2. 可以使用记号修改箭头颜色:A -[#red]> B
;
@startuml
A -> B : 正常消息
A ->x B : 丢失的消息
A ->> B : 小箭头消息
A -\ B : 单箭头消息
A -/ B : 单箭头消息
A o-> B : 圆点箭头消息
A ->o B : 圆点箭头消息
A -[#blue]> B : 修改箭头颜色
@enduml
消息编号
在 plantuml 中,通过关键字 autonumber start_num step
给消息自动编号;
可通过在双引号内指定编号的格式,格式是由 Java 的 DecimalFormat 类实现的:(0 表示数字;# 也表示数字,但默认为 0)。也可以用HTML标签来制定格式。
可以使用autonumber stop
停止使用编号。
@startuml
autonumber
A -> B : 编号的消息
autonumber 10 5
A -> B : 编号1的消息
A -> B : 编号4的消息
autonumber "<b>[000]"
A -> B : 3位编号
autonumber 15 "<b>(<u>##</u>)"
A -> B : 2位编号
autonumber 20 "<font color=red><b> 消息 0 :"
A -> B : 红色消息
@enduml
组合消息
在 plantuml 中,可以通过关键字alt, opt, loop, group, par, critical
声明组合消息。
- alt: 抉择,用来指明在两个或更多的消息序列之间的互斥的选择,相当于经典的
if..else..
。
抉择在任何场合下只发生一个序列。 可以在每个片段中设置一个临界来指示该片段可以运行的条件。else
的临界指示其他任何临界都不为 True 时应运行的片段。如果所有临界都为 False 并且没有 else,则不执行任何片段。
@startuml
alt 查询成功
发帖模块 -> 查贴模块 : 查询
return 帖子ID
else 查询失败小于3次
发帖模块 -> 查贴模块 : 查询
查贴模块 -> 查贴模块 : 重试
else 查询失败大于3次
发帖模块 -> 查贴模块 : 查询
return 查询错误码
end
@enduml
- opt :选项,包含一个可能发生或不发生的序列
@startuml
opt 查询频率超过 1000次/s
发帖模块 -> 查贴模块 : 查询
return 返回拒绝服务码
end
@enduml
- loop,循环
@startuml
loop 每周一
员工 -> 主管 : 汇报
return 安排工作
end
@enduml
- group: 后面紧跟着消息内容,表示一个序列组
@startuml
group 发帖操作
actor 用户
用户 -> 发帖模块 : 发贴
发帖模块 -> 数据库 : 查询数据库
return 查询结果
发帖模块 -> 数据库 : 添加数据库
return 添加成功
end
@enduml
- par:并行,表示两个消息可以并行就行,不同消息使用
else
隔开。
@startuml
客人 -> 厨师 : 点菜
activate 厨师
par
厨师 -> 厨师 : 炒菜
else
厨师 -> 厨师 : 炖汤
end
@enduml
- critical: 关键,用在 Par 或 Seq 片段中。 指示此片段中的消息不得与其他消息交错。
注释
在 plantuml 中,可以通过在消息后面添加 note left of 对象
或者 note right of 对象
关键词来给消息添加注释;
可以使用 end note 来添加多行注释;
可以使用 rnote或者 hnote
代替 note
,分别表示 矩形 与 六边形
可以在 note 的后面添加 #颜色
,改变 note 的颜色。
@startuml
发帖模块 -> 数据库 : 添加
note right of 发帖模块
需要用户密码认证
end note
发帖模块 -> 数据库 : 删除
hnote right of 发帖模块 #aqua
需要用户密码认证
end note
@enduml
分割
可以使用 == 关键字 ==
分割消息为不同的部分
@startuml
发帖模块 -> 数据库 : 添加
note right of 发帖模块
需要用户密码认证
end note
== 关键字 ==
发帖模块 -> 数据库 : 删除
hnote right of 发帖模块 #aqua
需要用户密码认证
end note
@enduml
参考
- plantuml 中文教程
- 软件方法:业务建模与需求 潘加宇
- planttext线上编辑plantuml
- UML建模之时序图(Sequence Diagram)
- UML建模(时序图)
- UML序列图总结(Loop、Opt、Par和Alt)
NFVschool 微信公共号,关注最前沿的网络技术。