markdown工具链plantuml-时序图

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 语言示意如下:

@startumlactor 角色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声明参与者:

@startumlactor actorboundary boundarycontrol controlentity entitydatabase database@enduml

  • 可以使用 <<>> 给参与者添加构造类型。在构造类型中,可以使用 (X,color) 格式的语法添加一个圆圈圈起来的字符;
  • 可以使用 participant 改变参与者的先后顺序与颜色。
  • 可以使用引号定义参与者,此时参与者可以使用特殊字符。
@startumlparticipant A << (C,#ADD1B2) Test >> order 2 #redparticipant B order 1 #99ff99A -> BB -> "C()" : 测试@enduml

order 值越小,越靠前。

包裹参与者

plantuml 可以使用 boxend box 画一个盒子将参与者包裹起来。 还可以在 box 关键字之后添加标题或者背景颜色。

@startumlAbox "帖子管理" #LightBlue participant 添帖模块 participant 查询模块end boxparticipant 数据库添帖模块 -> 查询模块 : 查询帖子查询模块 -> 数据库 : 查询数据库@enduml

外观参数

plantuml 用 skinparam 改变字体和颜色。
可以在如下场景中使用:

  • 在图示的定义中,
  • 在引入的文件中,
  • 在命令行或者ANT任务提供的配置文件中。
@startumlskinparam backgroundColor #EEEBDC skinparam handwritten trueskinparam 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 boxparticipant 数据库添帖模块 -> 查询模块 : 查询帖子查询模块 -> 数据库 : 查询数据库@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

@startumlA -> 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停止使用编号。

@startumlautonumber A -> B : 编号的消息autonumber 10 5A -> B : 编号1的消息A -> B : 编号4的消息autonumber "[000]"A -> B : 3位编号autonumber 15 "(##)" A -> B : 2位编号autonumber 20 " 消息 0 :"A -> B : 红色消息@enduml

组合消息

在 plantuml 中,可以通过关键字alt, opt, loop, group, par, critical声明组合消息。

  • alt: 抉择,用来指明在两个或更多的消息序列之间的互斥的选择,相当于经典的if..else..

抉择在任何场合下只发生一个序列。 可以在每个片段中设置一个临界来指示该片段可以运行的条件。else的临界指示其他任何临界都不为 True 时应运行的片段。如果所有临界都为 False 并且没有 else,则不执行任何片段。

@startumlalt 查询成功发帖模块 -> 查贴模块 : 查询return 帖子IDelse 查询失败小于3次发帖模块 -> 查贴模块 : 查询查贴模块 -> 查贴模块 : 重试else 查询失败大于3次发帖模块 -> 查贴模块 : 查询return 查询错误码end@enduml

  • opt :选项,包含一个可能发生或不发生的序列
@startumlopt 查询频率超过 1000次/s发帖模块 -> 查贴模块 : 查询return 返回拒绝服务码end@enduml

  • loop,循环
@startumlloop 每周一员工 -> 主管 : 汇报return 安排工作end@enduml

  • group: 后面紧跟着消息内容,表示一个序列组
@startumlgroup 发帖操作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 微信公共号,关注最前沿的网络技术。


原文链接

Was this helpful?

0 / 0

发表回复 0