使用UML画图
# 使用UML画图
本文介绍UML画图的基础支持,使用UML可以画各种图,如用例图、活动图、时序图、架构图等,本文以PlantUML为例讲解使用UML画图的方法。
# 1. 用例图
站在用户角度描述系统的功能。 三要素:
- 参与者 参与者可以是任何的事物,并不局限于真实人类。
- 用例
对应系统的某项功能。 - 关系
包括参与者之间、用例之间、参与者与用例之间的关系。
# 参与者
泛化关系:参与者之间可存在泛化关系。
# 用例
是对系统的用户需求(主要是功能需求)的描述,用例表达了系统的功能和所提供的服务
# 关系
关联关系
描述参与者和用例之间的关系。
泛化关系
用例之间的泛化关系。
包含关系
用例之间的包含关系。扩展关系
用例之间的扩展关系。
# PlantUML
PlantUML (opens new window)提供了用例图的定义方法。
可以使用package或rectangle对角色或用例分组。
# 2. 活动图 (opens new window)
类似于流程图。 plantUML (opens new window)提供了活动图的定义方法。支持泳道。
# 3. 状态图 (opens new window)
plantUML (opens new window)提供了状态图的定义方法。
# 4. 时序图 (opens new window)
时序图是一个二维图,横轴表示对象,纵轴表示时间,消息在各对象之间横向传递,依照时间顺序纵向排列。
通过经验来看,时序图不但可以把架构图要表达的内容描述出来,还能表示出时序,所以强烈推荐时序图。个人理解时序图就是表达数据在参与者之间的流向过程。 请求用实心箭头,响应用虚线箭头
plantUML (opens new window)提供了时序图的定义方法。
- 支持条件判断、分组等特性
利用该特性,可以做出比较复杂而清晰的时序图。详见时序图之组合消息 (opens new window)。
注意时序图的条件判断使用的关键字(alt/else/end
)和活动图中的关键字(if/elif/endif
)不同。 - 声明参与者
可以使用如下关键字声明参与者:
participant
actor(角色)
boundary(边界)
control(控制)
entity(实体)
database(数据库)
collections(集合)
queue(队列)
一般情况下,不声明参与者也可以画出想要的效果。但还是强烈建议在开始处定义好参与者,优点如下:
- 这样对图中的参与者有哪些可以一目了然。
- 某些时候,要想实现某些效果(如想使用box特性)要求必须声定义参与者。
消息编号
autonumber
可以从任意位置指定消息编号的开始序号。 如autonumber 20
。
还可以用语句 autonumber stop 和 autonumber resume //increment// //format// 来表示暂停或继续使用自动编号。注释
支持写注释,支持多行。
同级备注支持对齐,前面加一个/即可(/ note
)。
@startuml
note over Alice : Alice的初始状态
/ note over Bob : Bob的初始状态
Bob -> Alice : hello
@enduml
- 分隔符
可以使用分隔符==
把一张时序图中的若干个阶段定义名称。
@startuml
== 初始化 ==
Alice -> Bob: 认证请求
Bob --> Alice: 认证响应
== 重复 ==
Alice -> Bob: 认证请求
Alice <-- Bob: 认证响应
@enduml
- 动态创建参与者
可以使用create关键字动态创建参与者。
- 生命线
可以使用activate
和deactivate
来控制参与者生命线的激活状态。 - 快捷语法
生命线
、参与者的创建
、参与者的销毁
支持快捷语法,推荐使用。
++ 激活目标(可选择在后面加上#color)
-- 撤销激活源
return: 可以将2个语句压缩成1个return语句。返回的点是导致最近一次激活生命线的点。
** 创建目标实例
!! 摧毁目标实例
通过快捷键可以用一行语句同时控制激活和撤销动作,如
--++
:
@startuml
alice -> bob ++ : hello1
bob -> charlie --++ : hello2
charlie --> alice -- : ok
@enduml
- 包裹参与者
可以通过box和end box来对参与者分组。
@startuml
box "Internal Service" #LightBlue
participant Bob
participant Alice
end box
participant Other
Bob -> Alice : hello
Alice -> Other : hello
@enduml
美化
- 空间
可以使用|||
来增加线条之间垂直方向上的空间,提升用户体验。
@startuml Alice -> Bob: message 1 Bob --> Alice: ok ||| Alice -> Bob: message 2 Bob --> Alice: ok ||45|| Alice -> Bob: message 3 Bob --> Alice: ok @enduml
也可以使用数字自定义空间大小。
- 填充区设置
支持设置参与者之间的水平方向的距离,这样不会再显得那么紧凑,提升用户体验。
示例:
@startuml skinparam ParticipantPadding 20 skinparam BoxPadding 10 box "Foo1" participant Alice1 participant Alice2 end box box "Foo2" participant Bob1 participant Bob2 end box Alice1 -> Bob1 : hello Alice1 -> Out : out @enduml
- 空间
# 5. 思维导图
plantUML支持非UML图,如思维导图 (opens new window)。
可以灵活控制任意节点的相对位置(上下或左右)。
# 6. 架构图
可以使用plantUML画架构图, 详见https://plantuml.com/zh/archimate-diagram。 示例如下(画一个technology-device元素,文字是device Server,颜色是green):
archimate #green "device Server" as deviceA <<technology-device>>
actor User
deviceA -up-> User
教程页面中列举了archimate可使用的图标定义,本例中使用的是
technology-device
。 通过验证表明:文字的定义和颜色的定义位置只要在archimate
后,在<<technology-device>>
前即可。 可以通过-up->
或-down->
、->
、<-
实现通过不同的方向连接元素。 若元素的名称包含空格,那么被其他地方引用的时候,必须为名称定义别名且只能使用别名来引用。如该示例中的"device Server"
被引用的时候必须使用别名deviceA。