【程序员小知识】使用PlantUML画UML(下) 时序图

简介: 【程序员小知识】使用PlantUML画UML(下) 时序图

UML 序列图

序列图是仅次于类图的最常用 UML 图。 序列图将交互关系表示为一个二维图,纵向是时间轴,时间沿竖线向下延伸;横向轴代表了在协作中各个角色,一般是一个 Class 的对象,用一条虚线代表各角色的生命线,生命线上用矩形竖条表示是否处于活跃状态。对象之间可以发送同步或异步消息。

相对于类图,序列图可能更能体现 PlantUML 的价值

同步消息

@startuml
Alice -> Bob: Hi
Bob --> Alice: Hi
Alice -> Bob: Is this a pen?
Bob --> Alice: No! This is an apple!!
@enduml

image.png

  • 序列图基本构成: <角色> <消息类型> <角色> : <消息内容>
  • 消息类型中 -> 表示同步消息
  • --> 虚线表示返回消息

异步消息

@startuml
Alice ->> Bob: Hi
Alice ->> Bob: Is this a pen?
Alice ->> Bob: Is this a pen??
Alice ->> Bob: Is this a pen???
Alice ->> Bob: Is this a pen????
Bob -> Alice: This is an apple!!!
@enduml

image.png

--> 代表异步消息

角色生命线

@startuml
participant Alice
participant Bob
participant Carol
Carol -> Bob: Who is Alice?
Bob -> Alice: Are you Alice?
@enduml

image.png

  • 多个participant 会按照从左往右的顺序显示各角色生命线
  • 如果没有任何 participant, 则会角色出现的顺序显示从左往右显示其生命线

角色图例

@startuml
actor Actor
boundary Boundary
control Control
entity Entity
database Database
collections Collections
@enduml

image.png

除了 participant 之外, 使用其他关键字可以表示特殊的角色类型

发给自己的消息

@startuml
Aclie -> Aclie: do something by yourself
Aclie -> Aclie: do something by yourself
Aclie -> Aclie: do something by yourself
Aclie -> Aclie: do something by yourself
@enduml

image.png

消息序号

@startuml
Alice -> Bob: Hi
autonumber
Bob -> Carol: Hi
Carol -> Dave: Hi
Bob -> Dave: Hi
@enduml

image.png

有时候需要为消息添加序号以表示顺序,可以在第一个消息前添加 autonumber,后续消息自动添加序号。

起始序号与增量

@startuml
autonumber 3
Alice -> Bob: Hi
Bob -> Carol: Hi
autonumber 2 3
Carol -> Dave: Hi
Bob -> Dave: Hi
@enduml

image.png

autonumber <开始序号> <增量> 用来指定其实序号和序号递增的增量

消息序号暂停

@startuml
autonumber
Alice -> Bob: Hi
autonumber stop
Bob -> Carol: Hi
Carol -> Dave: Hi
autonumber resume
Bob -> Dave: Hi
Carol -> Dave: Hi
@enduml
  • autonumber stop: 自动序号暂停
  • autonumber resume: 自动序号继续

消息组

@startuml
Alice -> Bob: Is this a pen?
alt yes
    Alice <-- Bob: Yes! This is a pen!!
else no
    Alice <-- Bob: No! This is an apple!!!!!
end
@enduml

image.png

  • 有时候需要多个消息表示一组相关的逻辑,此时可以使用预置的关键字来表示各种逻辑,例如
  • alt/else
  • opt
  • loop
  • par
  • break
  • critical
  • 关键词之后添加表示逻辑的文字,例如 yes, no等
  • 消息信息的缩进不是必须的,但是加上可读性更好

消息组嵌套

消息组内可以嵌套其他消息组,如下:

@startuml
Alice -> Bob: Is this a pen?
alt yes
    Alice <-- Bob: Yes! This is a pen!!
else no
    Alice <-- Bob: Noooooooo! This is an apple!!!!!
    loop ∞
        Alice -> Bob: Oh sorry! By the way, is this a pen?
        Alice <-- Bob: No!!!!
    end
end
@enduml

image.png

自定义消息组

除了使用预置关键字的消息组,还可以使用任意名字自定义一个消息组

@startuml
group copy
    Alice -> Bob: Is this a pen?
    Alice <-- Bob: No! This is an apple!!
end
@enduml

image.png

group 之后添加消息组的名字

生命线活跃状态

@startuml
activate Alice
Alice -> Bob
activate Bob
Bob -> Carol
activate Carol
Bob <-- Carol
deactivate Carol
Alice <-- Bob
deactivate Bob
@enduml

image.png

  • activate <name> 指定name的生命线进入活跃状态
  • deactive <name> 指定name的生命线退出活跃状态

嵌套活跃状态

@startuml
activate Alice
Alice -> Bob
activate Bob
Bob -> Bob
activate Bob
Bob -> Carol
activate Carol
Bob <-- Carol
deactivate Carol
Alice <-- Bob
deactivate Bob
@enduml

image.png

activate 中继续 activate 可以嵌套活跃状态

创建角色和生命线

@startuml
Alice -> Bob
create Carol
Bob -> Carol: new
Bob -> Carol
Bob <-- Carol
Alice <-- Bob
@enduml

image.png

create <name> 用来创建一个角色和其生命线,此时消息箭头会执行角色图例

参考、引用

@startuml
Alice -> Bob
ref over Bob, Carol: ...
Alice <-- Bob
ref over Alice
...
...
end ref
@enduml

image.png

可以在时序图中添加参考信息

  • ref over <生命线名称> : <内容> : reference 的范围和参考内容
  • ref over ... end ref: 可以换行写参考内容

边界线

@startuml
== Foo ==
Alice -> Bob
Alice <-- Bob
== Bar ==
Bob -> Carol
Bob <-- Carol
@enduml

image.png

外部消息

@startuml
[-> Alice: Hello
Alice ->]: Hello
@enduml

image.png

消息箭头的前后使用 [] ,表示一个来自外部或者指向外部的消息

消息间隔

@startuml
Alice -> Bob
Alice <-- Bob
Alice -> Bob
Alice <-- Bob
|||
Alice -> Bob
Alice <-- Bob
||80||
Alice -> Bob
Alice <-- Bob
@enduml

image.png

  • 消息之间加 ||| , 会适当拉开消息间隔
  • ||<pixel>||:pixel可以指定具体间隔的像素数

备注

@startuml
Alice -> Bob
note left: Hello
Alice <-- Bob
note right: World
Alice -> Alice
note left
Hello
World
end note
@enduml

image.png

  • 消息后紧跟 note left 或者 note right 表示在相应位置添加备注,注意note 不能指定 top 或 bottom
  • note <left|right> ... end note 可以换行写备注
  • 备注内容支持 Creole 格式,Creole 的语法类似 Markdown

Creole 语法示例

@startuml
note left
  --标题--
  = 标题1
  == 标题2
  === 标题3
  --列表--
  * 列表1
  * 列表2
  ** 列表2-1
  # 有序列表1
  # 有序列表2
  ## 有序列表2-1
  --字体--
  * **粗体**
  * //斜体//
  * ""等宽字体(monospace)""
  * --删除线--
  * __下划线__
  --表格--
  |= |= Column1 |= Column2 |
  |1 |Value1-1  |Value1-2  |
  |2 |Value2-1  |Value2-2  |
  --HTML--
  * <color:red>设置颜色</color>
  * <color:#00FF00>色号</color>
  * <back:skyblue>背景色</back>
  * <size:18>字号</size>
  * <b>粗体</b>
  --目录--
  |_build.gradle
  |_src
    |_main
      |_java
        |_...
        |_...
    |_test
end note
@enduml

image.png

目录
相关文章
|
6月前
|
测试技术 uml
UML之时序图
UML之时序图
122 1
|
5月前
|
应用服务中间件 uml
【UML】软件工程中常用图:类图、部署图、时序图、状态图
【UML】软件工程中常用图:类图、部署图、时序图、状态图
455 1
|
4月前
|
测试技术 uml
UML使用问题之如何在PlantUML中表示执行者与用例之间的关联
UML使用问题之如何在PlantUML中表示执行者与用例之间的关联
|
4月前
|
测试技术 uml
UML使用问题之什么是泛化关系,在PlantUML中如何表示
UML使用问题之什么是泛化关系,在PlantUML中如何表示
|
5月前
|
Java 程序员 C#
程序员必知:UML关联聚合组合关系
程序员必知:UML关联聚合组合关系
52 0
|
6月前
|
数据可视化 测试技术 uml
【掌握绘图艺术】用PlantUML绘制完美UML图表,开发者的福音
【掌握绘图艺术】用PlantUML绘制完美UML图表,开发者的福音
1036 1
|
6月前
|
设计模式 数据可视化 程序员
不会画uml?推荐使用代码画图的工具PlantUml
不会画uml?推荐使用代码画图的工具PlantUml
582 1
|
6月前
|
程序员 uml
UML图 | 时序图(顺序、序列图)绘制
UML图 | 时序图(顺序、序列图)绘制
427 0
|
6月前
|
uml
UML之类图
UML之类图
90 1
|
6月前
|
数据可视化 Java uml
IDEA中一个被低估的功能,一键把项目代码绘制成UML类图
IDEA中一个被低估的功能,一键把项目代码绘制成UML类图
239 1