Plantuml 是什么?
首先得说一下UML,统一建模语言(英语:Unified Modeling Language,缩写 UML)是非专利的第三代和规约语言。
UML涵盖了很多类型的图,主要都是应用于软件开发行业。
在UML系统开发中有三个主要的模型:
功能模型:从用户的角度展示系统的功能,包括用例图。
对象模型:采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类别图、对象图。
动态模型:展现系统的内部行为。包括序列图,活动图,状态图。
而PlantUML是一个开源项目,除了支持快速绘制上面这些类型的图表之外,还支持很多图表,具体查看官方网站。
PlantUML通过编写文本的方式来定义UML图表,有点类似markdown,然后生成图表
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| @startuml ' Split into 4 pages page 2x2 skinparam pageMargin 10 skinparam pageExternalColor gray skinparam pageBorderColor black
class BaseClass
namespace net.dummy .BaseClass <| Meeting o
.BaseClass <|- Meeting
}
namespace net.foo { net.dummy.Person <|- Person .BaseClass <|
net.dummy.Meeting o }
BaseClass <| @enduml
|
输出效果

环境搭建
我们需要一个编辑器/IDE来编辑和预览UML图表,这里使用vscode
安装PlantUML插件

配置插件渲染方式
渲染方式有两种
- local 本地的Java渲染服务,需要Java运行环境及Graphviz
- PlantUMLServer 远程渲染服务器
方便起见,我们直接用官方的服务器

验证
新建 test.puml
1 2 3 4 5
| @startuml ' Split into 4 pages class BaseClass
@enduml
|
预览图表

PlantUML基础语法
由于PlantUML支持的图表类型比较多,每种图表的语法还不太一致,这里只简单介绍通用的语法,具体的图表还是建议查看官方文档。
也建议大家,在使用过程中记录适合自己的每种图表的模板,作图效率大大提高。
注意:语句类型是和图关联的,也就是说某些语句只能在某个图表用,而且PlantUML会根据你用到的语句猜测你是什么图表,然后进行渲染。
图表块
以@startuml和@enduml标记一个图表,还可以在开始处记录图表的名称(这里是hello-world)
1 2 3
| @startuml hello-world You -> World: Hello @enduml
|

注释和标记
- 单行注释:单引号
' 在行首
- 多行注释:以
/' 开始, 以 /' 结束
- 图表标记:
note left|right|top|bottom of XXX
1 2 3 4 5 6 7 8 9 10 11 12
| @startuml hello-world ' You -> World: Hello 单行注释
/' you can not 多行注释 see me '/
You <-> World: Hello note left of You: yoyoyo ' 标记 @enduml
|

对象和关系
对象: 图表中的方块,一般出现才关系的两端,有些需要额外定义(如接口,类)
关系:一般用形如箭头的字符来表示对象之间的关系,字符不同样式不同
1 2 3 4 5 6
| @startuml hello-world1 You -> World: Hello You <- World: also Hello You <-> World: Hololo You <--> World: Hololo @enduml
|

一些例子
时序图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| @startuml participant 用户 用户 -> 店长: 询问:iphone11 有吗? activate 店长
note left of 用户: 我很暴躁 note left of 店长: 巧了,我也是
店长 -> 服务员: 命令:去查下库存 activate 服务员 服务员 -> 库存系统: 查询库存 activate 库存系统 return 库存量 deactivate 库存系统 alt "库存量 > 0" 服务员 -> 店长: 通知:货多得很 else 服务员 -> 店长: 通知:没货了 end deactivate 服务员
alt "库存量 <= 0" 店长 -> 用户: 不凑巧,买完了 用户 -> 店长: 没货还挂着商品,耍人吗??? 用户 -> 店长: 愉快地打了一架 end 店长 -> 用户: Done @enduml
|

类图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| @startuml class Head class Body
class Animal { head body eye_num = 2 hand_num = 0 leg_num = 4 tail_num = 1
run() shout() }
class Cat
class Fish { hand_num = 0 leg_num = 0 tail_num = 1
swim() }
class FishShoal { shoal_size fish_type fish_array
migrate() } note left of FishShoal: 鱼群
class Human { hand_num = 2 leg_num = 2 tail_num = 0
speak() work() }
class Sutdent { study() }
class School { location level student_num student_array }
' 组合 Animal *-- Head Animal *-- Body
' 继承、扩展 Animal <|-- Cat Animal <|-- Fish Animal <|-- Human Human <|-- Sutdent
' 聚合 School o-- Sutdent: contains > FishShoal o-- Fish: contains > @enduml
|

参考资源