markdown工具链plantuml:像写代码一样绘制 UML 模型-时列图

markdown工具链plantuml:像写代码一样绘制 UML 模型-时列图

推荐一个chatgpt代理站(支持gpt4): www.gptschools.cn

概述

序列图具有直观、形象的特点,对于理清、呈现对象之间的交互关系非常有帮助。在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 可以使用 boxend 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

参考

NFVschool 微信公共号,关注最前沿的网络技术。


原文链接

posted @ 2020-08-30 20:02  可酷可乐  阅读(2741)  评论(0编辑  收藏  举报