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

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

异步消息

@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

--> 代表异步消息

角色生命线

@startuml
participant Alice
participant Bob
participant Carol

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

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

角色图例

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

除了 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

消息序号

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

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

起始序号与增量

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

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

  • 有时候需要多个消息表示一组相关的逻辑,此时可以使用预置的关键字来表示各种逻辑,例如
    • 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

自定义消息组

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

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

group 之后添加消息组的名字

生命线活跃状态

@startuml
activate Alice
Alice -> Bob

activate Bob
Bob -> Carol

activate Carol
Bob <-- Carol

deactivate Carol
Alice <-- Bob

deactivate Bob
@enduml

  • 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

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

创建角色和生命线

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

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

参考、引用

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

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

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

边界线

@startuml
== Foo ==
Alice -> Bob
Alice <-- Bob

== Bar ==
Bob -> Carol
Bob <-- Carol
@enduml

== <name> == 添加边界线,跨越所有角色的生命线

外部消息

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

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

消息间隔

@startuml
Alice -> Bob
Alice <-- Bob

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

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

备注

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

  • 消息后紧跟 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

猜你喜欢

转载自blog.csdn.net/vitaviva/article/details/120735745
今日推荐