捣鼓PlantUML(三、时序图)
简单介绍
时序图(Sequence Diagram),又名序列图、循序图、顺序图,是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。它可以表示用例的行为顺序,当执行一个用例行为时,其中的每条消息对应一个类操作或状态机中引起转换的触发事件。
PlantUML使用->箭头将一条消息连接两个对象(参与者)。对象本身不需要特别声明。如果想使用虚线箭头,则使用–>。箭头方向调转<-和<–也是可以正常使用的。使用反向箭头画出的图形不会有变化,只是文档更易于理解。需要注意的是,反向箭头只在时序图中可以这样使用,在其他Plant UML的时序图中则含义不完全相同。
我们可以试着写一个基本的例子:
@startuml张三 -> 李四 : 我要借钱
李四 --> 张三 : 借给你
张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款@enduml
画出的时序图如下:
代码注释
在uml文档中,使用单引号’ 表示该行后面的都为注释。如果需要注释多行,则使用/’ 和 ‘/作为注释的开始和结束。
例如对前面的示例代码进行注释:
@startuml张三 -> 李四 : 我要借钱
'李四 --> 张三 : 借给你
/'张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款'/@enduml
则得到的时序图如下:
声明参与者对象
可以通过事先声明的方式,使参与者在时序图中保持确定的顺序。声明可以使用participant
关键字,除此以外,还可以使用以下关键字:
- actor
- boundary
- control
- entity
- database
使用这些关键字画出的参与者对象的图案稍有不同,但是含义相同。示例如下:
@startumlparticipant par
actor act
boundary bou
control con
entity ent
database datpar->act : to actor
par->bou : to boundary
par->con : to control
par->ent : to entity
par->dat : to database@enduml
另外,还可以在声明参与者对象的时候,通过as
关键字来为对象赋予一个简单的别名,需要注意图中显示的字要用双引号引起来。除此之外,声明时还可以对对象的图案指定背景颜色。
示例如下:
@startumlparticipant "我是很长的一段话,如果要用我来表达的话,就太长了吧!" as par
actor act #FF0000
boundary bou #00FF00
control con #0000FF
entity ent #FFFF00
database dat #00FFFFpar->act : to actor
par->bou : to boundary
par->con : to control
par->ent : to entity
par->dat : to database@enduml
双引号非声明的参与者对象
我们可以在箭头指向对象的时候,直接使用非声明的对象。并且,对于长句子,或者有特殊符号的字符串,可以使用双引号引起来。在箭头指向的语句中,也可以通过as
关键字,为双引号定义的参与者对象设置别名。
@startuml张三 -> "Tom()" : Hello
"Tom()" -> "牛儿还在山上吃草,放牛的却不知道哪里去了的王二小" as wang : Hi
wang --> "Tom()" : How are you@enduml
发给自己的消息
参与者对象,除了将消息发送给其他参与者外,还可以将消息发给自己。消息如果有多行,可以用\n
进行换行。
@startuml张三 -> "Tom()" : Hello
"Tom()" -> "牛儿还在山上吃草,放牛的却不知道哪里去了的王二小" as wang : Hi
wang --> "Tom()" : How are you
wang -> wang : 我要把鬼子引到埋伏圈去!\n 让八路军把这些鬼子都干掉~@enduml
箭头类型
时序图的箭头除了常用的->
以外,还可以指定不同类型的箭头。它们分别是:
- 箭头末端为一把叉。表示消息丢失。
- 使用
\
或者/
来代替<
和>
,可以得到只有上半部或者下半部的箭头。 - 使用两个箭头符号(
\\
、//
或者>>
、<<
),使箭头变为细线箭头。 - 使用
--
代替-
,可以变为虚线箭头。 - 在箭头末尾增加一个
o
,可以在箭头末尾增加一个O。 - 可以使用双向箭头。
为了更直观的展示箭头样式,请看下面的示例:
@startuml阴 -> 阳
阴 --> 阳
阴 ->x 阳
阴 ->> 阳
阴 -\ 阳
阴 -\\ 阳
阴 /-- 阳
阴 //-- 阳
阴 ->o 阳
阴 <-> 阳
阴 <-->o 阳
阴 o<-->x 阳@enduml
箭头颜色
箭头除了类型可以变化外,箭头的颜色也是可以改变的。指定箭头颜色的方式,就是在箭头符号的第一个字符后插入颜色标记[#color]
。
例如:
@startuml树木 -[#green]> 树林
树林 -[#00FF00]> 森林
树林 <[#red]-- 森林
树木 <[#FF0000]-- 树林@enduml
消息数字序号
很多时候,时序图消息太多,我们需要在消息上增加序号以理清先后顺序。在PlantUML中,我们可以使用autonumber
关键字,就可以自动为消息加上数字序号。例如:
@startuml
autonumber张三 -> 李四 : 我要借钱
李四 --> 张三 : 借给你
张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款@enduml
autonumber
除了这样单独使用外,还可以指定开始的数字序号,和每次递增的数字。如果只使用开始序号,则使用autonumber 'start'
,如果还需要指定每次递增的数字,则使用autonumber 'start' 'increment'
。例如:
@startuml
autonumber张三 -> 李四 : 我要借钱
李四 --> 张三 : 借给你autonumber 12张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款autonumber 20 5张三 -> 李四 : 我还要借钱
李四 --> 张三 : 不借了@enduml
另外,我们还可以指定数字序号的格式。使用方法是在autonumber
后用双引号指定数字序号格式。数字需要的格式指定方式为Java的DecimalFormat方式。(0表示数字,不足的时候占位,#表示数字,不足时不占位)。在格式化的双引号中,还可以使用一些html标签。例如:
@startuml
autonumber "<b>[000]"张三 -> 李四 : 我要借钱
李四 --> 张三 : 借给你autonumber 12 "<b>(<u>###</u>)"张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款autonumber 20 5 "<font color=red>MSG #"张三 -> 李四 : 我还要借钱
李四 --> 张三 : 不借了@enduml
除此之外,还可以使用autonumber stop
停止消息序列计数,然后再通过autonumber resume 'increment' 'format'
,继续计数。这里就不再写例子示范了。
标题
title
关键字,可以为时序图指定标题。例如:
@startumltitle 借钱与还钱的故事张三 -> 李四 : 我要借钱
李四 --> 张三 : 借给你@enduml
图表说明
legend
关键字与endlegend
关键字配合使用,为图表配一段说明文字。可以指定right
、left
或者center
来指定说明的对齐位置。例如:
@startumllegend center
这是一个借钱与还钱发生的故事。
故事发生在一个夜黑风高的晚上……
endlegend张三 -> 李四 : 我要借钱
李四 --> 张三 : 借给你@enduml
图表分割
当时序图过长,或者处于某种逻辑考虑时,需要将图表分割为几部分。这时可以使用newpage
关键字。例如:
@startuml张三 -> 李四 : 我要借钱
李四 --> 张三 : 借给你newpage张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款newpage 最后的标题张三 -> 李四 : 我还要借钱
李四 --> 张三 : 不借了@enduml
这将生成三张图片:
消息分组
为了让时序图消息更有逻辑性,我们常需要对消息进行分组框起来。在PlantUML中,可以使用一下关键字对消息进行分组:
- alt/else
- opt
- loop
- par
- break
- critical
- group (后接需要显示的字符)
除了group以外,其他关键词后可以接字符串,让其显示在分组框的上方居中位置。另外,分组之间可以嵌套。例如:
@startumlalt 借钱案例
张三 -> 李四 : 我要借钱loop 循环借钱100次
group 成功案例
李四 --> 张三 : 借给你
end张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款
endelse 借钱失败
张三 -> 李四 : 我还要借钱
李四 --> 张三 : 不借了end@enduml
为消息添加注释
很多时候,我们需要在时序图中对消息进行注释,以便做详细的说明。在PlantUML中,可以紧跟消息箭头语句之后,使用note left
或者note right
关键字来添加注释。如果注释有多行,可以在多行注释后,通过end note
来结束注释。示例:
@startuml张三 -> 李四 : 我要借钱
note left: 我借钱肯定会还你的!李四 --> 张三 : 借给你
note right: 我相信你肯定会还我钱的!张三 -> 李四 : 我要还钱
note left
有借有还,
再借不难!
end note李四 --> 张三 : 收到欠款
note right: 有诚信!张三 -> 李四 : 我还要借钱
李四 --> 张三 : 不借了@enduml
为参与者对象添加注释
注释除了添加到消息外,还可以直接在时序图中添加到参与者对象上。使用note left of
,note right of
或note over
关键字即可实现。同样,可以在关键字语句后加颜色来改变注释的颜色。另外,也可以与note end
组合使用,来添加多行注释。
@startumlparticipant 张三
participant 李四note left of 张三 #00FF00
我的名字叫张三,
家里有房又有田。
谁知来了个李四,
从此生活大变样。
end notenote right of 李四: 我是李四大哥note over 张三: 谁敢比我惨~~~note over 李四: 我比你更惨~~~note over 张三,李四 #red
左手一只鸡,
右手一只鸭,
不得禽流感算我瞎!
end note@enduml
注释的形状
注释除了note
的形状以外,还可以使用hnote
和rnote
。hnote
表示六边形,rnote
表示长方形。示例:
@startumlparticipant 张三
participant 李四rnote left of 张三 #00FF00
我的名字叫张三,
家里有房又有田。
谁知来了个李四,
从此生活大变样。
end notenote right of 李四: 我是李四大哥note over 张三: 谁敢比我惨~~~note over 李四: 我比你更惨~~~hnote over 张三,李四 #red
左手一只鸡,
右手一只鸭,
不得禽流感算我瞎!
end note@enduml
Creole和HTML格式
首先,可以使用Creole定义文本格式。它包括:
**黑体**
//斜体//
""等宽字体""
--删除线--
__下划线__
~~ 波浪线~~
除此外,在note中还可以使用一些html标签:
<back:red></back>
背景色<size:18></size>
字体大小<u:red></u>
下划线<color red></color>
字体颜色<s:red></strike>
删除线<w:FF33FF></w>
波浪线<img source.jpg>
图片
示例:
@startumlparticipant 张三
participant 李四张三 -> 李四 : **我要借钱**
note left: ~~我借钱肯定会还你的!~~李四 --> 张三 : <color red>借给你</color>
note right: <u:blue>我相信你肯定会<s:green>还我钱</s>的!</u>张三 -> 李四 : **<size:20>我要还钱</size>**
note left
<color blue>~~有借有还,~~</color>
<color pink>--再借不难!--</color>
end note李四 --> 张三 : 收到欠款
note right: 有诚信!<img img.png>张三 -> 李四 : 我还要借钱
李四 --> 张三 : 不借了@enduml
分割线
我们可以将时序图按照逻辑步骤,使用分割线,将时序图分割为多个不同的步骤阶段。分割线是需要使用==
关键字。示例:
@startuml== 借钱阶段 ==张三 -> 李四 : 我要借钱
李四 --> 张三 : 借给你== 还钱阶段 ==张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款== 再次借钱阶段 ==张三 -> 李四 : 我还要借钱
李四 --> 张三 : 不借了@enduml
引用
使用ref over
可以为参与者对象指定引用组件。示例:
@startumlparticipant 杰瑞
actor 汤姆ref over 杰瑞,汤姆 : 初始化杰瑞 -> 汤姆 : Hello~ref over 汤姆
多行表达,
就应该这样!
end ref@enduml
延时
在时序图中,我们可以指定两条消息之间的延时。并且可以为这个延时添加文字说明。需要使用的关键字为...
。示例:
@startuml张三 -> 李四 : 我要借钱
李四 --> 张三 : 借给你... 八百年后 ...张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款... 一天后 ...张三 -> 李四 : 我还要借钱
李四 --> 张三 : 不借了@enduml
间隔空间
使用|||
关键字可以为上下两条内容多分隔出一定空间。另外,还可以使用||45||
来指定分隔空间的具体像素。示例:
@startuml张三 -> 李四 : 我要借钱
李四 --> 张三 : 借给你
|||
张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款
||50||
张三 -> 李四 : 我还要借钱
李四 --> 张三 : 不借了@enduml
生命线的激活与销毁
activate
和deactivate
关键字用来指明参与者对象的活跃周期。当一个参与者对象被激活,则表示它的活跃周期开始,生命线变为长方形。activate
和deactivate
关键词用在触发激活的消息之后。
除此外,还可以使用destroy
关键字,它表示参与者对象的生命线结束。示例:
@startuml张三 -> 李四 : 我要借钱
activate 张三
activate 李四李四 -> 王五 : 你给他担保我才借
activate 王五王五 --> 李四 : 我给他担保
destroy 王五李四 --> 张三 : 借给你张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款
deactivate 李四张三 -> 李四 : 我还要借钱
李四 --> 张三 : 不借了
deactivate 张三@enduml
除此外,生命线还可以嵌套。也就是一个参与者对象可以多次activate
和deactivate
。另外,可以为生命线指定背景色。示例:
@startuml张三 -> 李四 : 我要借钱
activate 张三
activate 李四李四 -> 李四 : 四处筹钱
activate 李四 #FFBBBB李四 -> 王五 : 你给他担保我才借
activate 王五王五 --> 李四 : 我给他担保
destroy 王五deactivate 李四李四 --> 张三 : 借给你张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款
deactivate 李四张三 -> 李四 : 我还要借钱
李四 --> 张三 : 不借了
deactivate 张三@enduml
动态创建参与者对象
在这之前,我们讨论的情况都是参与者在时序图一开始的时候都已经存在。然而实践中,我们经常会遇到某些参与者对象是在时序图的某个阶段才动态创建出来的。
在PlantUML中,我们可以使用create
关键字来动态创建参与者对象。其后紧跟一条发送给它的消息,以表明是由这条消息触发了创建这个参与者对象。示例:
@startuml张三 -> 李四 : 我要借钱
activate 张三
activate 李四李四 -> 张三 : 风险有点大,有担保吗?create 王五
张三 -> 王五 : 我来虚拟个担保人
activate 王五王五 --> 李四 : 我给他担保
destroy 王五李四 --> 张三 : 借给你张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款
deactivate 李四张三 -> 李四 : 我还要借钱
李四 --> 张三 : 不借了
deactivate 张三@enduml
进出消息
当我们需要将注意力放在一个参与者对象时,我们只关心它的消息进出情况。因此,这样的时序图只需要一个参与对象,然后通过[
和]
配合箭头来表示进出消息。示例:
@startuml张三 ->] : 我要借钱
activate 张三[--> 张三 : 风险有点大,有担保吗?
activate 张三 #FFBBBB张三 -> 张三 : 我来虚拟个担保人[--> 张三 : 借给你
deactivate 张三张三 ->] : 我要还钱
[--> 张三 : 收到欠款张三 ->] : 我还要借钱
[--> 张三 : 不借了
deactivate 张三@enduml
固定版式和字母标记
在参与者对象声明时,使用<<
和>>
可以生成固定版式标记。在这个版式中,可以使用指定颜色的圆圈的字母标记。标记的方法是,在版式中使用(X,color)
。示例:
@startumlparticipant "放牛的王二小" as 王 <<自动生成>>
participant 鬼子 <<(O,#FF0000) 自动生成>>王 -> 鬼子 : 带你去埋伏圈 @enduml
固定版式中可以没有字符,这样就可以只有字母标记了。示例:
@startumlparticipant "放牛的王二小" as 王 <<(X,#00FF00)>>
participant 鬼子 <<(O,#FF0000)>>王 -> 鬼子 : 带你去埋伏圈 @enduml
参与者对象组合
有时候多个参与者对象构成了一个更大的逻辑对象。这时,我们可以将这多个参与者对象用一个框框起来,表达它们逻辑上的关联。为了画出这样的需求,我们可以使用box
和end box
组合来将参与者对象放到一起。box
关键字后面,可以接一个方框的标题,和指定方框的背景色。示例:
@startumlbox "解放军部队" #LightBlue
participant 将军
participant 士兵
end boxparticipant 敌人将军 -> 士兵 : 指挥
士兵 -> 敌人 : 消灭@enduml
去掉底部的重复参与者对象
之前我们画出的所有时序图,顶部和底部都对称地显示了相同的参与者对象。为了图标更为简洁,我们有时需要去掉底部重复的对象,也可以表达相同的含义。这时,我们需要使用hide footbox
关键字。示例:
@startumlhide footbox
title "八年抗战开始了"box "解放军部队" #LightBlue
participant 将军
participant 士兵
end boxparticipant 敌人将军 -> 士兵 : 指挥
士兵 -> 敌人 : 消灭@enduml
皮肤参数
为了时序图更美观,PlantUML还可以使用skinparam
关键字来统一定义字体、颜色以及其他外观风格。先看一个简单的例子:
@startumlskinparam sequenceArrowThickness 2
skinparam roundcorner 20
skinparam maxmessagesize 60
skinparam sequenceParticipant underline张三 -> 李四 : 我要借钱
activate 张三
activate 李四李四 -> 李四 : 四处筹钱
activate 李四 #FFBBBB李四 -> 王五 : 你给他担保我才借
activate 王五王五 --> 李四 : 我给他担保
destroy 王五deactivate 李四李四 --> 张三 : 借给你张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款
deactivate 李四张三 -> 李四 : 我还要借钱
李四 --> 张三 : 不借了
deactivate 张三@enduml
除此外,PlantUML还支持更多的呈现风格个性化,特别是手写风格看起来非常个性化。例如下面一个稍复杂的例子:
@startumlskinparam backfroundColor #EEEBDC
skinparam handwritten trueskinparam sequence {ArrowColor DeepSkyBlueActorBorderColor blueLifeLineBorderColor blueLifeLineBackgroundColor #A9DCDFParticipantBorderColor DeepSkyBlueParticipantBackgroundColor DodgerBlueParticipantFontName AapexParticipantFontColor #A9DCDFActorBackgroundColor aquaActorFontColor DeepSkyBlueActorFontSize 17ActorFontName Aapex
}张三 -> 李四 : 我要借钱
activate 张三
activate 李四李四 -> 李四 : 四处筹钱
activate 李四 #FFBBBB李四 -> 王五 : 你给他担保我才借
activate 王五王五 --> 李四 : 我给他担保
destroy 王五deactivate 李四李四 --> 张三 : 借给你张三 -> 李四 : 我要还钱
李四 --> 张三 : 收到欠款
deactivate 李四张三 -> 李四 : 我还要借钱
李四 --> 张三 : 不借了
deactivate 张三@enduml
结束语
到这里,使用PlantUML画时序图的捣鼓就告一个段落了。最后放上一个最近工作中画的一个物联网设备APP端调用支付宝充值服务费的时序图来结束本文吧~
捣鼓PlantUML(三、时序图)相关推荐
- 捣鼓PlantUML(二、组件图)
简单介绍 为什么先讲组件图,是因为我是由于需要画组件图所以才去找的这个工具.组件图实质就是将一个大系统,拆分为若干功能相对独立,互相之间存在关联依赖关系的组件集合.然后由一张图列出所有组件及它们之间的 ...
- 捣鼓PlantUML
捣鼓PlantUML(一.环境)http://blog.csdn.net/zh_weir/article/details/53006537 捣鼓PlantUML(二.组件图)http://blog.c ...
- PlantUML 绘制时序图
PlantUML系列文章 PlantUML绘制活动图https://blog.csdn.net/zhangwei_david/article/details/125507374PlantUML绘制类图 ...
- 捣鼓PlantUML(一、环境)
PlantUML简单介绍 PlantUML是一个用文本描述画出UML图的工具.很早之前在CSDN一篇博客中看到别人家的UML又简洁又大方,当时就想知道是用什么软件画的.现在知道了,就是用PlantUM ...
- Intellij IDEA中安装使用PlantUML画时序图、类图等
转载自 https://www.jianshu.com/p/a6bd7e3048ef 一.在Intellij安装PlantUML插件 在菜单栏Intellij IDEA打开插件安装窗口(版本不一样,可 ...
- 使用 PlantUML 绘制时序图
目录 一.简介 二.安装 1.1 安装插件到PyCharm 2.2 验证 2.2.1 插件检查是否安装 2.2.2 新建PlantUML文件 一.简介 Github地址:https://github. ...
- PlantUML 之时序图
UML Sequence 今晚上借着燥热的天气学习下UML图的使用,然后开始连续3篇,时序图.活动图.类图的学习记录,为对项目开发中混沌的业务逻辑还以清晰. UML Sequence UML Clas ...
- PlantUML:一款让你爽到起飞的高效代码绘制时序图工具
背景 对于工作中遇到一些复杂的业务逻辑场景,需要借助图形工具去准确的表达,会更高效的理解和梳理复杂的逻辑,同时在跟领导和同事汇报时也更能清晰.准确.快速的表达想法以及方案.比如梳理源码常用的时序图以及 ...
- PlantUML绘制类图
系列文章目录 PlantUML绘制活动图https://blog.csdn.net/zhangwei_david/article/details/125507374 PlantUML 绘制时序图htt ...
最新文章
- python库整理目录
- java comparator_Java基础之String漫谈(二)
- datetime mysql 当天_MySQL 获得当前日期时间(以及时间的转换)
- 在Ubuntu下安装jdk解压出现问题:./jdk-6u30-linux-i586.bin: 113: ./install.sfx.3631: not found
- 四万字让你精通SQL数据库操作
- weka manual 3.6 翻译:1.1 引言
- android 判断资源是否使用6,android-download-manager – Android 6获取下载文件的路径
- 利用FreeType和OpenGL进行矢量字体渲染
- GridView 分页导航
- word怎么把页面顺序倒过来_Word打印错乱——出现两个第1页
- cadence元件编号更新_OrCAD教程:如何对元件进行替换与更新
- 大学matlab教程,大学数学MATLAB应用教程
- 西安交大王之坤摘得金奖桂冠,浙大团体第一,1016名高手同台竞技CCSP2020
- 题目:L2-029 特立独行的幸福 (25 分)
- sql数据库包含关系查询
- 2022年河南省高职单招(综合素质)考试冲刺试题及答案
- 操作系统 --cpu与指令集
- Java中多选题判断正确
- 前端基础入门之css定位 position
- Ubuntu18.04鼠标闪烁、无线网卡不识别问题
热门文章
- java media player 设置音量_SoundPlayer可调音量 - c#
- 用Python批量操作文件
- python十二星座符号_12种编程语言类比12星座女
- Error: ADB exited with exit code 1 Performing Streamed Install adb: failed to install D:\svn\app\sm
- 一加3 android 8.0,一加3 android 8.0 启动uiautomator server失败
- java anon,试图找到泄漏!对于pmap来说,anon意味着什么?
- 大一护理专业计算机挂科,大一就迎来这些难度大的学科,往年“挂科率”高,大一学生需重视...
- 上周内外盘行情回顾及交易情况2022.4.4
- 虚幻引擎之自定义着色模型(ShadingModel)
- JAVA 数组降序排列思路