常用UML图及PlantUML代码画图:时序图
目的
通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作关系;
将交互行为建模为消息传递,通过描述消息是如何在对象间发送和接收的来动态展示对象之间的交互,包括发送消息、接受消息、处理消息、返回消息;
直观地描述并发进程。
概念
时序图(Sequence Diagram),又名序列图、循序图,是一种二维图,横轴表示对象,纵轴表示时间,消息在各个对象之间横向传递,按照时间顺序纵向排列。
角色(Actor)
系统角色,可以是人、机器、其他系统、子系统。
对象(Object)
对象包括三种命名方式:
第一种方式包括对象名和类名;例如:直播课时:课时,在时序图中,用“对象:类”表示;
第二种方式只显示类名不显示对象名,即表示他是一个匿名对象;例如: :课程;在时序图中,用“:类”表示;
第三种方式只显示对象名不显示类明;例如:讲师;在时序图中,用“对象”表示。
对象的左右顺序并不重要,但是为了作图清晰整洁,通常应该遵循以下二个原则:
- 把交互频繁的对象尽可能的靠拢
- 把初始化整个交互活动的对象放置在最左端
生命线(Lifeline)
在时序图中表示为从对象图标向下延伸的一条虚线,表示对象存在的时间。
激活期(Activation)
又名控制焦点(Focus of Control),它代表时序图在对象时间线上某段时期执行的操作,以一个很窄的矩形表示。
消息(Message)
消息类型 | 表示 |
同步消息 | 实心箭头 + 实线 |
异步消息 | 空心箭头 + 实线 |
回调消息 | 空心箭头 + 虚线 |
返回消息 | 实心箭头 + 虚线 |
自关联消息 | 实心箭头 + 实线 |
1)同步消息(Synchronous Message)
发送者把控制传递给消息的接收者,然后停止活动,等待消息的接收者放弃或者返回控制。用来表示同步的意义,以一条实线和实心箭头表示。
图例
```plantuml
@startuml
User -> Server: 1: Login (同步消息)
activate Server
Server ->> Database: 2: saveInfo (异步消息)
activate Database
Server -->> User: 3: result (回调消息)
deactivate Server
@enduml
```
2)异步消息(Asynchronous Message)
发送者通过消息把信号传递给消息的接收者,然后继续自己的活动,不等待接受者返回消息或者控制。异步消息的接收者和发送者是并发工作的,以一条实线和空心箭头表示。
图例
1:同步消息,2:异步消息,3: 回调消息
这个图的意思就是 User 发出 Login 的消息给 Server,Server 发送保存用户消息给到数据库,注意这里的消息是异步消息。
3)回调消息(Reply Message)
在事件发生之前或之后,向其他接收者发送请求,接收者可以据此进行必要的数据同步(发送后回调),或者根据业务需求干预事件的后续处理流程(发送前回调)。
图例
1:同步消息,2:异步消息,3: 回调消息
上图的意思就是 User 发出 Login 的消息给 Server 后,Server 同时发出异步消息给数据库和登录结果给到用户。
4)返回消息(Return Message)
表示从过程调用返回。回调发送的是一个异步消息,收发双方并行进行各自的活动,并且并非任何异步消息都要有相对应的回调消息,而返回消息则是与同步消息匹配的,同步消息的发送方必须等待接收方响应后才能继续后续的动作。
图例
代码示例
```plantuml
@startuml
User -> Server: 查询数据 (同步消息)
Server --> User: 数据结果 (返回消息)
@enduml
```
5)自关联消息(Self Message)
表示方法的自身调用或者一个对象内的一个方法调用另外一个方法。
图例
代码示例
```plantuml
@startuml
User -> User: 自关联消息\nselfMessage
@enduml
```
组合片段
组合片段用来解决交互执行的条件和方式,它允许在序列图中直接表示逻辑组件,用于通过指定条件或子进程的应用区域,为任何生命线的任何部分定义特殊条件和子进程。组合片段常用的有这么几种:
类型 | 名称 | 说明 |
alt(alternatives) | 选择 | 包含一个片段列表,这个片段列表有备选的消息序列,每次只能走一个消息序列 |
opt(option) | 选项 | 包含一个可能会发生的消息序列 |
loop(iteration) | 重复 | 包含一个可以重复的消息序列 |
par(parallel) | 并行 | 包含一个可以并行的消息序列 |
break(break) | 中断 | 如果执行了此部分则放弃了序列的其他部分的执行,可用于中断 loop 片段 |
不常用组合片段 | ||
critical | 关键 | 用在Par或seq片段中。指示此片段中的消息不得与其他消息交错。 |
seq | 弱顺序 | 有两个或更多操作数片段。涉及同一生命线的消息必须以片段的顺序发生。如果消息涉及的生命线不同,来自不同片段的消息可能会井行交错。 |
strict | 强顺序 | 有两个或更多操作数片段。这些片段必须按给定顺序发生。 |
consider | 考虑 | 指定此片段描述的消息列表。其他消息可发生在运行的系统中,但对此描述来说意义不大。在"Messages"属性中键入该列表。 |
ignore | 忽略 | 此片段未描述的消息列表。这些消息可发生在运行的系统中,但对此描述来说意义不大。在"Messages"属性中键入该列表。 |
assert | 断言 | 操作数片段指定唯一有效的序列。通常用在Consider或Ignore片段中。 |
neg | 否定 | 此片段中显示的序列不得发生。通常用在Consider或Ignore片段中。 |
1)选择(alt, alternatives)
图例
代码示例
```plantuml
@startuml
participant ClassA as a
participant ClassB as b
alt a > 1
a -> b: 1:Message1
activate b
deactivate b
else else
a -> b: 2:Message2
activate b
deactivate b
end
@enduml
```
2)选项(opt, option)
图例
代码示例
```plantuml
@startuml
participant ClassA as a
participant ClassB as b
opt a > 1
a -> b: 1:Message1
activate b
deactivate b
end
@enduml
```
3)重复(loop, iteration)
图例
代码示例
```plantuml
@startuml
participant ClassA as a
participant ClassB as b
loop
a -> b: 1:Message1
activate b
deactivate b
end
loop 10次
a -> b: 1:Message1
activate b
deactivate b
end
@enduml
```
4)并行(par, parallel)
图例
代码示例
```plantuml
@startuml
participant ClassA as a
participant ClassB as b
par
a -> b: 1:Message1
activate b
deactivate b
else
a -> b: 2:Message2
activate b
deactivate b
else
a -> b: 3:Message3
activate b
deactivate b
end
@enduml
```
5)中断(break)
图例
代码示例
```plantuml
@startuml
participant ClassA as a
participant ClassB as b
participant ClassC as c
loop 10次
a -> b: 1:Message1
activate b
deactivate b
break a > 0
a -> c: 2:Message2
activate c
deactivate c
end
end
@enduml
```
绘制注意事项
时序图的绘制步骤可简单总结如下:
划清边界,识别交互的语境;
将所要绘制的交互场景中的角色以及对象梳理出来;
从触发整个交互的某个消息开始,在生命线之间从上到下依次画出所有消息,并注明每个消息的特性(如参数等)
以学生在教务系统中查询其课程的成绩为例,来解释时序图的绘制方法。
划清边界,识别交互的语境
所谓划清边界,就是要界定好自己所要画的时序图的范围,“学生在教务系统中查询其课程的成绩”就是所要绘制的时序图的交互内容,不用往上延伸到用户登录,也不要往下延伸到下载成绩单。
识别交互的语境,即是读懂所要画的时序图的前提和背景。比如本例中,既然学生可以查询成绩,那么该学生肯定已经注册并认证过其身份,并可选择其所考试的课程查询相应成绩。
梳理角色和对象
对象的梳理是一个相对主观的过程,比如本例中,课程以及成绩分别作为了对象存在,也可以合并为数据库这一个对象。
在本例中,角色有学生,对象有教务系统、课程、成绩。注意:角色以及对象,都为名词,动词不可作为角色和对象,如“成绩查询”不可作为对象。
添加消息
学生的登录验证作为本时序图的前置行为,可直接引用到本时序图中,也可忽略不画;学生进入成绩查询页面后,页面会加载本学生的成绩查询课程列表,并显示出课程对应的成绩;
代码示例
```plantuml
@startuml
Actor ":用户" as user
participant ":教务系统" as sys
participant ":课程" as course
participant ":成绩" as score
ref over user, sys
用户登录验证
end ref
user -> sys: 请求成绩查询课程列表
activate user
activate sys
sys -> course: 获取成绩查询课程列表
activate course
course --> sys: 返回成绩查询课程列表
deactivate course
sys -> score: 获取成绩信息
activate score
score --> sys: 返回成绩信息
deactivate score
sys --> user: 显示成绩
deactivate sys
deactivate user
@enduml
```