文章目录
- Android studio安装插件
- VSCode安装插件
- 语法参考
- 简单的示例
- 1 时序图
- 1.1 简单示例
- 1.2 声明参与者(participant,actor..)
- 1.2.1 重命名(as),注释,参与者顺序(order)
- 1.3 在参与者中使用非字母符号
- 1.4 给自己发消息
- 1.5 修改箭头样式
- 1.6 修改箭头颜色
- 1.7 对消息序列编号(autonumber自动生成消息序号)
- 1.8 标题,头和尾(title,header,footer)
- 1.9 分割示意图(分页显示)
- 1.10 组合消息
- 1.11 给消息添加注释(note left, note right,end note)
- 1.12 其他的注释(note left of,note right of,note over高亮等)
- 1.13 改变备注框的形状(hnote 和 rnote)
- 1.15 分隔符(==)
- 1.16 引用
- 1.17 延迟(...)
- 1.18 空间(|||)
- 1.19 生命线的激活与撤销(activate, deactivate)
- 1.20 返回Return
- 1.21 创建参与者(create)
- 1.22 进入和发出消息([ ])
- 1.23 构造类型和圈点
- 1.24 更多标题信息
- 1.25 包裹参与者
- 1.26 移除脚注(hide footbox)
- 1.27 外观参数 (skinparam)
- 1.28 填充区设置
- 3 类图
- 3.1 类之间的关系
- 3.2 关系上的标识
- 3.3 添加方法
- 3.4 定义可访问性
- 3.5 抽象与静态
- 3.6 高级类体
- 3.7 备注和模板
使用了太久的visio画图,想体验下更有针对性的UML画图工具
Android studio安装插件
File->Settings->Plugins->Marketplace,搜索UML
就能看到PlantUML integration插件:
点击Install plugin安装,然后重启Android studio。
图形化显示需要Graphviz,下载地址点击这里
下载安装完成后,在File->Settings->Other Settings ->PlantUML中填入刚刚安装的Graphviz目录下bin目录中的dot.exe
文件:
VSCode安装插件
- 安装VS CODE
- 安装plantuml插件
- 安装graphviz
在windows下是alt+d
生成预览图
之后右键->New->PlantUML File就可以新建一个UML文件了:
语法参考
简单的示例
1 时序图
1.1 简单示例
用 -> 来绘制参与者之间传递的消息,用 –> 绘制一个虚线箭头。
<- 和 <– 反向指定
注意:仅适用于时序图,对于其它示意图,规则是不同的。
@startuml
A->B : comment1
B-->A : comment2
A-->B : comment3
B<-A : comment4
@enduml
1.2 声明参与者(participant,actor…)
前面那个四方形的参与者是participant
(中文翻译就是参与者)。
还有其他参与者的关键字如下:
• actor
• boundary
• control
• entity
• database
@startuml
actor actor_obj
boundary boundary1_obj
control control_obj
entity entity_obj
database database_obj
collections collections_obj
@enduml
不同的参与者使用不同的头像:
加上传递的消息:
@startuml
actor actor_obj
boundary boundary1_obj
control control_obj
entity entity_obj
database database_obj
collections collections_obj
actor_obj->boundary1_obj: log1
actor_obj->control_obj: log2
actor_obj->entity_obj: log3
actor_obj->database_obj: log4
actor_obj->collections_obj:log5
@enduml
1.2.1 重命名(as),注释,参与者顺序(order)
关键字 as
用于重命名参与者
可以使用 RGB 值或者颜色名修改参与者的背景颜色。
所有以 单引号 '
开头的语句,被认为是一个注释, 多行注释,以 /'
和 '/
作为注释的开始和结束。
@startuml
actor actor_obj #red
participant participant_obj
/'这是一段
可换行的注释'/
participant "我的名字太长了" as L #99ff99
' 单行注释
participant_obj->actor_obj: log1
actor_obj->participant_obj: log2
actor_obj->L: log3
@enduml
关键字 order
自定义参与者顺序
@startuml
participant 第三位 order 30
participant 第二位 order 20
participant 第一位 order 10
@enduml
1.3 在参与者中使用非字母符号
@startuml
A->"B()" : 因为括号非字母,所以需要双引号
"B()" -> "这是一个长名字" as Long
Long-> "B()" : OK
@enduml
1.4 给自己发消息
参与者可以给自己发信息,消息文字可以用 \n 来换行。
@startuml
A->A: 自己发给自己\n,再换个行
@enduml
1.5 修改箭头样式
修改箭头样式的方式有以下几种:
• 表示一条丢失的消息:末尾加 x
• 让箭头只有上半部分或者下半部分:将 < 和 > 替换成 \ 或者 /
• 细箭头:将箭头标记写两次 (如 >> 或 //)
• 虚线箭头:用 – 替代 -
• 箭头末尾加圈:->o
• 双向箭头:<->
@startuml
A->x B_obj
A-\ B_obj
A-/ B_obj
A->> B_obj
A--> B_obj
A-->O B_obj
A<-> B_obj
@enduml
1.6 修改箭头颜色
你可以用以下记号修改箭头的颜色:
@startuml
A-[#red]> B_obj : log1
A<[#0000FF]-B_obj : log2
@enduml
1.7 对消息序列编号(autonumber自动生成消息序号)
关键字 autonumber
用于自动对消息编号。
@startuml
autonumber
A-> B_obj : log1
A<-B_obj : log2
@enduml
语句 autonumber start
用于指定编号的初始值,而 autonumber start increment
可以同时指定编号的初始值和每次增加的值。
@startuml
autonumber
A-> B_obj : log1
A<-B_obj : log2
autonumber 15
A-> B_obj : log3
A<-B_obj : log4
autonumber 40 10
A-> B_obj : log5
A<-B_obj : log6
@enduml
还可以在双引号内指定编号的格式,格式是由 Java 的 DecimalFormat
类实现的:(0 表示数字;# 也表示数字,但默认为 0), 也可以用 HTML 标签来制定格式。
@startuml
autonumber "<b>[000]"
A-> B_obj : log1
A<-B_obj : log2
autonumber 15 "<b>(<u>##</u>)"
A-> B_obj : log3
A<-B_obj : log4
autonumber 40 10 "<font color=red><b>Message 0 "
A-> B_obj : log5
A<-B_obj : log6
@enduml
还可以用语句 autonumber stop
和 autonumber resume increment format
来表示暂停或继续使用自动编号。
@startuml
autonumber "<b>[000]"
A-> B_obj : log1
A<-B_obj : log2
autonumber stop
A-> B_obj : log3
A<-B_obj : log4
autonumber resume 10 "<font color=red><b>Message 0 "
A-> B_obj : log5
A<-B_obj : log6
@enduml
1.8 标题,头和尾(title,header,footer)
@startuml
header 这是一个header
footer 当前是%page% of %lastpage%
title 这是一个标题
A-> B_obj : log1
A<-B_obj : log2
@enduml
1.9 分割示意图(分页显示)
关键字 newpage
用于把一张图分割成多张, 在 newpage
之后添加文字,作为新的示意图的标题。这样就能很方便地在 Word 中将长图分几页打印。
@startuml
A-> B_obj : log1
A<-B_obj : log2
newpage 新的一页
A-> B_obj : log3
A<-B_obj : log4
@enduml
1.10 组合消息
我们可以通过以下关键词组合消息:
• alt/else
• opt
• loop
• par
• break
• critical
• group
关键词 end
用来结束分组。
@startuml
A_obj-> B_obj : log1
alt 遇到end结束
A_obj<-B_obj : log2
end
@enduml
可以看到alt
会显示在组内的左上角,但group除外,它只显示消息
@startuml
A_obj-> B_obj : log1
group 遇到end结束
A_obj<-B_obj : log2
end
@enduml
分组可以嵌套使用
@startuml
A_obj-> B_obj : log1
alt alt-log
A_obj<-B_obj : log2
else else-log
group group-子分组
A_obj<-B_obj : log4
end
A_obj->B_obj : log3
end
@enduml
1.11 给消息添加注释(note left, note right,end note)
通过在消息后面添加 note left
或者 note right
关键词来给消息添加注释。也可以通过使用 end note
来添加多行注释。
@startuml
A_obj-> B_obj : log1
note left: 这是左注释
note right: 这是右注释
A_obj<- B_obj : log2
note left
左注释
多行
end note
@enduml
1.12 其他的注释(note left of,note right of,note over高亮等)
可以使用 note left of
,note right of
或 note over
在节点 (participant) 的相对位置放置注释。还可以通过修改背景色来高亮显示注释。以及使用关键字 end note
来添加多行注释。
@startuml
participant A_obj
note left of A_obj #red
这是A_obj的
多行note
end note
note over A_obj : 这是A_obj的的中间note
@enduml
1.13 改变备注框的形状(hnote 和 rnote)
可以使用 hnote
和 rnote
这两个关键字来修改备注框的形状,就是把前面的note
关键字前面加上r
或h
。
@startuml
participant A_obj
hnote left of A_obj #red
这是A_obj的
多行note
end note
rnote over A_obj : 这是A_obj的的中间note
@enduml
1.15 分隔符(==)
通过使用 ==
关键词来将图表分割多个步骤
@startuml
== 分隔线1 ==
A_Obj->B_Obj: log1
== 分隔线2 ==
A_Obj->B_Obj: log2
@enduml
1.16 引用
通过使用 ref over
关键词来实现引用
@startuml
participant A_Obj
participant B_Obj
ref over A_Obj,B_Obj: 引用A和B
A_Obj->B_Obj: log1
ref over B_Obj:只引用B
@enduml
1.17 延迟(…)
使用...
来表示延迟,并且还可以给延迟添加注释。
@startuml
A_Obj->B_Obj: log1
...
B_Obj->A_Obj: log2
...延迟的注释...
@enduml
1.18 空间(|||)
可以使用 |||
来增加空间。还可以使用数字(||50||
)指定增加的像素的数量。
@startuml
A_Obj->B_Obj: log1
|||
B_Obj->A_Obj: log2
||50||
B_Obj->A_Obj: log3
@enduml
1.19 生命线的激活与撤销(activate, deactivate)
关键字 activate
和 deactivate
用来表示参与者的生命活动。
一旦参与者被激活,它的生命线就会显示出来(一个长方框)。destroy
表示一个参与者的生命线的终结(一把叉)。
@startuml
User->A: 初始化
activate A
A -> B: 发送请求
activate B
B -> C: 处理请求
activate C
C ->B: 请求处理完成(结束)
destroy C
B -> A: 返回结果
deactivate B
A -> User: 反初始化
deactivate A
@enduml
还可以使用嵌套的生命线,并且运行给生命线添加颜色。
@startuml
User->A: 初始化
activate A #red
A->A: A自己\n调自己
activate A #yellow
A -> B: 发送请求
activate B
B -> A: 返回结果
deactivate B
A->A: A自己\n调自己2
deactivate A
A -> User: 反初始化
deactivate A
@enduml
1.20 返回Return
生成带有可选文本标签的返回消息,返回的点是那个最近激活当前生命线的点,看两个例子的返回处就明白了
@startuml
User->A:在User之后就初始化了C
activate A
activate B
activate C
A -> B
B -> C
C ->B
return return到User
@enduml
@startuml
User->A
activate A
activate B
A -> B
B -> C:在B之后才初始化了C
activate C
C ->B
return return到B
@enduml
1.21 创建参与者(create)
把关键字 create
放在第一次接收到消息之前,以强调本次消息实际上是在创建新的对象。
@startuml
create B
A -> B
B -> C
@enduml
可以看到B被提到最前面显示
1.22 进入和发出消息([ ])
如果只想关注部分图示,你可以使用进入和发出箭头。使用方括号 [
和]
表示图示的左、右两侧, 简单的把方括号 [
和]
认为是一个隐形的参与者就好了。
@startuml
[->A: A进入\n消息
A->B: log1
B<-]: B进入消息
B->]: B发出消息
[<-A: A发出\n消息
@enduml
还可以使用下面的语法:
@startuml
[-> A
[o-> A
[o->o A
[x-> A
A ->]
A ->o]
A o->o]
A ->x]
A <-]
A x<-]
@enduml
1.23 构造类型和圈点
可以使用 <<
和 >>
给参与者添加构造类型。在构造类型中,你可以使用 (X,color)
格式的语法添加一个圆圈圈起来的字符。
@startuml
participant "比较长的A" as A << 构造 >>
participant "比较长的B" as B << (C,#ff0000) 构造 >>
A -> B
@enduml
1.24 更多标题信息
可以在标题中使用 creole
格式。在标题描述中使用 \n
表示换行。
@startuml
title __应该__ 怎么 \n写标题呢
A -> B
@enduml
还可以使用关键字 title
和 end title
定义多行标题。
@startuml
title
<u>下划线</u> 标题
第<font color=red>二行</font>
end title
A->B
@enduml
1.25 包裹参与者
可以使用 box
和 end box
画一个盒子将参与者包裹起来。
还可以在 box
关键字之后添加标题或者背景颜色。
@startuml
box "title" #yellow
participant A_Obj
participant B_Obj
end box
participant C_Obj
A_Obj -> B_Obj
@enduml
1.26 移除脚注(hide footbox)
使用 hide footbox
关键字移除脚注。
@startuml
hide footbox
A_Obj -> B_Obj
@enduml
1.27 外观参数 (skinparam)
用 skinparam
改变字体和颜色。
@startuml
skinparam backgroundColor #EEEBDC
skinparam handwritten true
skinparam sequence {
ArrowColor DeepSkyBlue
ActorBorderColor DeepSkyBlue
LifeLineBorderColor blue
LifeLineBackgroundColor #A9DCDF
ParticipantBorderColor DeepSkyBlue
ParticipantBackgroundColor DodgerBlue
ParticipantFontName Impact
ParticipantFontSize 17
ParticipantFontColor #A9DCDF
ActorBackgroundColor aqua
ActorFontColor DeepSkyBlue
ActorFontSize 17
ActorFontName Aapex
}
actor User
participant "First Class" as A
participant "Second Class" as B
participant "Last Class" as C
User -> A: DoWork
activate A
A -> B: Create Request
activate B
B -> C: DoWork
activate C
C --> B: WorkDone
destroy C
B --> A: Request Created
deactivate B
A --> User: Done
deactivate A
@enduml
1.28 填充区设置
可以设定填充区的参数配置。
@startuml
skinparam ParticipantPadding 20
skinparam BoxPadding 10
box "box1" #yellow
participant A1
participant B1
end box
A1-> B1: log1
A1<- B1: log2
@enduml
3 类图
3.1 类之间的关系
类之间的关系通过下面的符号定义:
使用… 来代替 – 可以得到点线.
在这些规则下,也可以绘制下列图形
@startuml
Class1 <|-- Class2
Class3 *-- Class4
Class5 O-- Class6
Class7 .. Class8
Class9 -- Class10
@enduml
@startuml
Class11 <|.. Class12
Class13 --> Class14
Class15 ..> Class16
Class17 ..|> Class18
Class19 <--* Class20
@enduml
@startuml
Class21 #-- Class22
Class23 x-- Class24
Class25 }-- Class26
Class27 +-- Class28
Class29 ^-- Class30
@enduml
3.2 关系上的标识
在关系之间使用标签来说明时, 使用 :
后接标签文字。对元素的说明,你可以在每一边使用 ""
来说明.
@startuml
Class1 "上方" *-- "下方" Class2: 中间\n日志
@enduml
在标签的开始或结束位置添加 <
或 >
以表明是哪个对象作用到哪个对象上,注意<
或 >
后需要带上空格。
@startuml
class Car
Driver - Car : drivers >
Car *- Wheel : < have 4
Car -- Person : < owns
@enduml
3.3 添加方法
为了声明字段 (对象属性)或者方法,你可以使用后接字段名或方法名。系统检查是否有括号来判断是方法还是字段。
@startuml
Object <|-- ArrayList
Object : equals()
ArrayList : Object[] elementData
ArrayList : size()
@enduml
也可以使用 {}
把字段或者方法括起来,注意,这种语法对于类型/名字的顺序是非常灵活的。
@startuml
class Dummy {
String data
void methods()
}
class Flight {
flightNumber : Integer
depart : Data
}
@enduml
可以(显式地)使用 {field}
和 {method}
修饰符来覆盖解析器的对于字段和方法的默认行为。
@startuml
class A {
{field} field1
{field} field2
{method} method1
{method} method2
}
@enduml
3.4 定义可访问性
@startuml
class Dummy {
-field1
#field2
~method1()
+method2()
}
@enduml
可以采用以下命令停用这些特性 skinparam classAttributeIconSize 0
:
@startuml
skinparam classAttributeIconSize 0
class Dummy {
-field1
#field2
~method1()
+method2()
}
@enduml
3.5 抽象与静态
通过修饰符 {static}
或者 {abstract}
,可以定义静态或者抽象的方法或者属性。
@startuml
class Dummy {
{static} String id
{abstract} Void method()
}
@enduml
3.6 高级类体
PlantUML 默认自动将方法和属性重新分组,你可以自己定义分隔符来重排方法和属性,下面的分隔符都是可用的:--
..
==
__
.
@startuml
class Dummy {
第一行
..
第二行
==
第三行
--
}
@enduml
3.7 备注和模板
模板通过类关键字 ("<<
" 和">>
") 来定义
可以使用 note left of
, note right of
, note top of
, note bottom of
这些关键字来添加备注。
你还可以在类的声明末尾使用 note left
, note right
,note top
, note bottom
来添加备注。
此外,单独用 note
这个关键字也是可以的,使用 ..
符号可以作出一条连接它与其它对象的虚线。
@startuml
class Object<<general>>
Object <|--ArrayList
note top of Object: 模板的\n顶部注释
note "这是个浮动的注释" as N1
note "这个注释居中" as N2
Object..N2
N2..ArrayList
class Foo
note left: 左注释
@enduml