类图

类图描述系统的静态结构:类、它们的属性和方法,以及类之间的关系。它是文档化代码组织与设计时最常用的 UML 图。

在 PlantUML 中,语法与编程语言相近,因此属性、方法和可见性标记都能自然写出。表示关系的箭头与时序图采用相同的风格。

所有图类型通用的功能,请参阅通用命令

元素声明

[参考 protocolstruct:GH-1028, 对于exception:QA-16258]

[Ref. for protocol and struct: GH-1028, for exception: QA-16258, for record and dataclass: GH-2232]

[Ref. for protocol and struct: GH-1028; for exception: GH-1056, QA-16258; for metaclass and stereotype: GH-1159, QA-16784; for record and dataclass: GH-2232]
WARNING
 This translation need to be updated. 
WARNING

类之间的关系

类之间的关系是用以下符号定义的。

类型 符号 目的
扩展 <|-- 类在层次结构中的特化
实现 <|.. 通过类实现接口
构成 *-- 没有整体就没有部分
聚合 o-- 部分可以独立于整体而存在
依赖性 --> 对象使用另一个对象
依赖 ..> 一种较弱的依赖形式

可以用.. 来代替-- ,会显示为虚线。

示例:

WARNING
 This translation need to be updated. 
WARNING

关系上的标签

在关系之间使用标签来说明时, 使用 :后接 标签文字。

对元素的说明,你可以在每一边使用 "" 来说明.

在标签的开始或结束位置添加<>以表明是哪个对象作用到哪个对象上。

在元素名称和关系标签中使用非字母

如果你想在类(或枚举...)的显示名称中使用非字母,你可以:

如果一个别名被分配给一个元素,文件的其余部分必须用别名而不是名称来指代该元素。

$

开始的名称注意,以$ 开始的名称以后不能被隐藏或删除,因为hideremove 命令会认为该名称是$tag 而不是一个组件名称。要想以后删除这些元素,它们必须有一个别名或必须被标记。

还要注意的是,以$ 开始的名字是有效的,但是要给这样的元素分配一个别名,必须把名字放在引号"" 之间。

添加方法

要声明属性和方法,你可以使用符号:,后面跟字段或方法的名称。

编译器会通过检查括号来选择方法和字段。

可用花括号{} 为所有属性和方法分组。

注意,语法对类型/名称的顺序有很大的灵活性。

你可以使用{field}{method}修饰符来覆盖编译器对属性和方法的默认识别。

定义能见度(可访问性)

当你定义属性或者方法时,你可以使用特殊符号定义相应条目的可访问性质。

字符 图标(属性) 图标(方法) 可访问性
- private 私有
# protected 受保护
~ package private 包内可见
+ public 公有

你可以采用命令 skinparam classAttributeIconSize 0 来展示特殊符号本身:

*[Ref. [QA-4755](https://forum.plantuml.net/4755/provide-display-visibility-attributes-private-protected)]*
WARNING
 This translation need to be updated. 
WARNING

Visibility on compositions and aggregations

[Ref. QA-8294]

抽象与静态

通过修饰符{static}或者{abstract},可以定义静态或者抽象的方法或者属性。

这些修饰符可以写在行的开始或者结束。也可以使用{classifier}这个修饰符来代替{static}.

高级类体

PlantUML默认自动将方法和属性重新分组,你可以自己定义分隔符来重排方法和属性,下面的分隔符都是可用的:-- .. == __.

还可以在分隔符中添加标题:

备注和版型

版型通过类关键字("<<"和">>")来定义

你可以使用note left of , note right of , note top of , note bottom of这些关键字来添加备注。

你还可以在类的声明末尾使用note left, note right,note top, note bottom来添加。

此外,单独用note这个关键字也是可以的,使用 .. 符号可以作出一条连接它与其它对象的虚线。

WARNING
 This translation need to be updated. 
WARNING

备注中的更多功能

可以在注释中使用部分html标签 (See Creole expression):

你也可以在注释中展示多行。

你也可以在定义的class之后直接使用 note left, note right, note top, note bottom 来定义注释。

WARNING
 This translation need to be updated. 
WARNING

注释属性 (field, attribute, member) 或方法

可以在属性(field、attribute、member)或方法上添加注释。

⚠ 注意

注释属性或方法

给同名方法注释

[Ref. QA-3474 and QA-5835]

WARNING
 This translation need to be updated. 
WARNING

链接的注释

在定义链接之后,你可以用 note on link 给链接添加注释

如果想要改变注释相对于标签的位置,你也可以用 note left on linknote right on linknote bottom on link。(对应位置分别在label的左边,右边,下边)

抽象类和接口

用关键字abstractabstract class来定义抽象类。

抽象类用斜体显示。

也可以使用interface, annotationenum 等关键字。

*[参考: '标注和成员' Issue#458]*
WARNING
 This translation need to be updated. 
WARNING

隐藏属性、函数等

通过使用命令“hide/show”,你可以用参数表示类的显示方式。

基础命令是: hide empty members. 这个命令会隐藏空白的方法和属性。

empty members 外,你可以用:

同样可以使用 hideshow 关键词,对以下内容进行设置:

你可以使用 show/hide 命令来定义相关规则和例外。

*[Ref. [QA-2913](https://forum.plantuml.net/2913/hiding-based-on-visibilty?show=2916#a2916)]*
WARNING
 This translation need to be updated. 
WARNING

隐藏类

你也可以使用 show/hide 命令来隐藏类

如果你定义了一个大的!included 文件,且想在文件包含之后隐藏部分类,该功能会很有帮助。

WARNING
 This translation need to be updated. 
WARNING

删除类

您还可以使用remove命令来删除类。

如果您定义了一个大的 [!included file](预处理), 并且如果您想在 [file contains](预处理)之后删除一些类,这可能很有用。

隐藏、删除或还原标记元素或通配符

您可以在元素上放置$tags (使用$ ),然后单独或按标记删除、隐藏或还原组件。

默认情况下,所有组件都会显示:

但您可以:

隐藏或删除未关联的类

默认情况下, 所有的类都将会展示:

不过你可以使用:

[Adapted from QA-11052]

泛型(generics)

你可以用 <> 来定义类的泛型。

It is possible to disable this drawing using skinparam genericDisplay old command.

指定标记(Spot)

通常标记字符 (C, I, E or A) 用于标记 类(classes), 接口(interface), 枚举(enum)和 抽象类(abstract classes).

但是当你想定义原型时,可以增加对应的单个字符及颜色,来定义自己的标记(spot),就像下面一样:

你可以通过关键词 package 声明包,同时可选的来声明对应的背景色(通过使用html色彩代码或名称)。

注意:包可以被定义为嵌套。

WARNING
 This translation need to be updated. 
WARNING

包样式

包可以定义不同的样式。

你可以通过以下的命令来设置默认样式 : skinparam packageStyle,或者对包使用对应的模板:

你也可以参考下面的示例来定义包之间的连线:

命名空间(Namespaces)

在使用包(package)时(区别于命名空间),类名是类的唯一标识。 也就意味着,在不同的包(package)中的类,不能使用相同的类名。

在那种情况下(译注:同名、不同全限定名类),你应该使用命名空间来取而代之。

你可以从其他命名空间,使用全限定名来引用类, 默认命名空间(译注:无名的命名空间)下的类,以一个“."开头(的类名)来引用(译注:示例中的BaseClass).

注意:你不用显示地创建命名空间:一个使用全限定名的类会自动被放置到对应的命名空间。

There won't be any difference between namespaces and packages anymore: both keywords are now synonymous.

There won't be any difference between ``namespaces`` and ``packages`` anymore: both keywords are now synonymous.
WARNING
 This translation need to be updated. 
WARNING

自动创建命名空间

使用命令 set namespaceSeparator ??? 你可以自定义命名空间分隔符(为 “.” 以外的字符).

禁止自动创建包则可以使用 set namespaceSeparator none.

WARNING
 This translation need to be updated. 
WARNING

棒棒糖接口

需要定义棒棒糖样式的接口时可以遵循以下语法:

改变箭头方向

类之间默认采用两个破折号 -- 显示出垂直 方向的线. 要得到水平方向的可以像这样使用单破折号 (或者点):

你也可以通过改变倒置链接来改变方向

也可通过在箭头内部使用关键字, 例如left, right, up 或者 down,来改变方向

您可以使用缩写形式来表示方向,第一个字符(例如,-d- 而不是 -down-) 或前两个字符 (-do-)。

请注意,您不应滥用此功能:Graphviz 通常无需调整即可提供良好的结果。

同时也支持 left to right direction 参数:

WARNING
 This translation need to be updated. 
WARNING

“关系”类

你可以在定义了两个类之间的关系后定义一个 关系类 association class 例如:

也可以用另一种方式:

同级关联(Association on same classe)

[参考: Incubation: Associations]

WARNING
 This translation need to be updated. 
WARNING

样式参数

skinparam改变字体和颜色。

可以在如下场景中使用:

模板样式

你可以给模型自定义颜色和字体(You can define specific color and fonts for stereotyped classes.)

Any of the spaces shown as `_` below will cause all skinparams to be ignored, see [discord discussion](https://discord.com/channels/1083727021328306236/1289954399321329755/1289967399302467614) and [issue #1932](https://github.com/plantuml/plantuml/issues/1932):
WARNING
 This translation need to be updated. 
WARNING

渐变颜色

你可以使用 # 号为类、注释等等自定义颜色。

在自定义颜色中你可以使用标准颜色的名称 或 RGB 编码,参见: Colors.

你同样可以使用下面的语法为背景色声明为渐变的颜色:

渐变的两个颜色可以使用下面的符号分割: 他们的区别在于颜色渐变的方向不同。

例如:

辅助布局

有时候,默认布局并不完美...

你可以使用 together 关键词将某些类进行分组: 布局引擎会尝试将它们捆绑在一起(如同在一个包(package)内)

你也可以使用建立 hidden 链接的方式来强制布局

拆分大文件

有些情况下,会有一些很大的图片文件。

可以用 page (hpages)x(vpages) 这个命令把生成的图片文件拆分成若干个文件。

hpages 用来表示水平方向页面数, and vpages 用来表示垂直方面页面数。

你也可以使用特定的皮肤设定来给分页添加边框(见例子)

继承(Extends) 和 实现(implements)

同样可使用 extendsimplements 关键词.

*[Ref. [QA-2239](https://forum.plantuml.net/2239/is-multiple-inheritance-or-implementation-possible)]*
WARNING
 This translation need to be updated. 
WARNING

方括号表示关系(连接或箭头)的样式

线样式

可以明确的使用 bold, dashed, dotted, hiddenplain 来表示关系, 连接或箭头:

[改编自 QA-4181]

线颜色

线宽度

[参考: QA-4949]

混合样式

改变关系(线和箭头)的颜色和样式(单行样式)

你可以改变表示关系的线和箭头的颜色或样式,使用下面的单行样式格式:

[See similar feature on deployment]

改变类颜色和样式 (单行样式)

你可以改变定义类的 颜色 或样式, 通过下面两种指定格式:

第一个颜色(#color)表示背景色,然后第二个表示线的样式和颜色(##[style]color)

[参考: QA-1487]

第一个原始示例:

[参考. QA-3770]

类成员的箭头方向(Arrows from/to class members)

[参考: QA-3636]

[参考: QA-5261]

分组继承关系(Grouping inheritance arrow heads)

你可以用skinparam groupInheritance关键字合并泛化箭头, 后接参数合并阈值(从几个继承类时开始合并)。

GroupInheritance 1 (不合并)

GroupInheritance 2 (从2个组开始合并)

GroupInheritance 3 (从3个组开始合并)

GroupInheritance 4 (从4个组开始合并)

[参考: QA-3193, 和 QA-13532]

Display JSON Data on Class or Object diagram

Simple example

[Ref. QA-15481]

For another example, see on JSON page.

Packages and Namespaces Enhancement

[From V1.2023.2+, and V1.2023.5]

[Ref. GH-1352]

Qualified associations

Minimal example

[Ref. QA-16397, GH-1467]

Another example

Change diagram orientation

You can change (whole) diagram orientation with:

Top to bottom (by default)

With Graphviz (layout engine by default)

The main rule is: Nested element first, then simple element.

With Smetana (internal layout engine)

The main rule is the opposite: Simple element first, then nested element.

Left to right

With Graphviz (layout engine by default)

With Smetana (internal layout engine)

Role label to associations

[Ref. GH-2536, GH-2537]