免费注册
流程类
图形化表达方式
脑图类
结构化表达方式
笔记类
高效化表达方式
实用工具
实用工具
业务与管理领域
软件工程与系统设计
UML
数据分析与研究
工程与技术设计
数据库与信息系统
树形图
括号图
思维笔记

类图语法

类图

类图是面向对象建模的主要构建块。它用于应用结构的一般概念建模,以及将模型转换为编程代码的详细建模。 类图也可用于数据建模。类图中的类既表示应用中的主要元素和交互,也表示需要编程的类。

代码:
                            
复制
嵌入
--- title: Animal example --- classDiagram note "From Duck till Zebra" Animal <|-- Duck note for Duck "can fly can swim can dive can help in debugging" Animal <|-- Fish Animal <|-- Zebra Animal : +int age Animal : +String gender Animal: +isMammal() Animal: +mate() class Duck{ +String beakColor +swim() +quack() } class Fish{ -int sizeInFeet -canEat() } class Zebra{ +bool is_wild +run() }

语法

类

UML提供了表示类成员(例如属性和方法)及其附加信息的机制。类的单个实例包含三个部分:

  • 顶部包含类的名称。它以粗体居中打印,首字母大写。它也可能包含可选的注释文本,描述类的性质。
  • 中间包含类的属性。它们左对齐,且首字母小写。
  • 底部包含类可以执行的操作。它们也是左对齐的,并且首字母小写。
代码:
                            
复制
嵌入
--- title: Bank example --- classDiagram class BankAccount BankAccount : +String owner BankAccount : +Bigdecimal balance BankAccount : +deposit(amount) BankAccount : +withdrawal(amount)

定义一个类

定义类有两种方法

  • 显式使用关键字 class(如 class Animal),这将定义 Animal 类。
  • 通过一种关系,它同时定义两个类及它们之间的关系(如 Vehicle <|-- Car)。
代码:
                            
复制
嵌入
classDiagram class Animal Vehicle <|-- Car

命名规范:类名只能由字母数字字符(包括 unicode)、下划线(_)和中划线 (-) 组成。

类别标签

如果你需要为类提供标签,可以使用以下语法:

代码:
                            
复制
嵌入
classDiagram class Animal["Animal with a label"] class Car["Car with *! symbols"] Animal --> Car

你还可以使用反引号(``)来转义标签中的特殊字符:

代码:
                            
复制
嵌入
classDiagram class `Animal Class!` class `Car Class` `Animal Class!` --> `Car Class`

定义类的成员

UML提供了表示类成员(如属性和方法)以及关于它们的附加信息的机制。

Mermaid会根据是否存在小括号()来区分属性和函数或方法。带有 () 的被视为函数或方法,其余的都被视为属性。

有两种方法可以定义类的成员,无论使用哪种语法来定义成员,输出结果是相同的。两种不同的方式是:

1、使用冒号(:)后跟成员名称来关联类的成员,这对于一次定义一个成员很有用。例如:

代码:
                            
复制
嵌入
classDiagram class BankAccount BankAccount : +String owner BankAccount : +BigDecimal balance BankAccount : +deposit(amount) BankAccount : +withdrawal(amount)

2、使用大括号{}关联类的成员,其中成员分组在大括号内。适合一次定义多个成员。例如:

代码:
                            
复制
嵌入
classDiagram class BankAccount{ +String owner +BigDecimal balance +deposit(amount) +withdrawal(amount) }

返回类型

你可以在方法或函数定义的末尾指定将返回的数据类型。注意:最后的 ')' 和返回类型之间必须有一个空格。一个例子:

代码:
                            
复制
嵌入
classDiagram class BankAccount{ +String owner +BigDecimal balance +deposit(amount) bool +withdrawal(amount) int }

通用类型

通用类型可以作为类定义的一部分表示,也可以用于类成员或返回类型。为了将一个项目表示为通用类型,请将该类型用波浪号(~)括起来。支持嵌套类型声明,例如 List<List<int>> ,但当前不支持包含逗号的通用类型,如 List<List<K, V>> 。

代码:
                            
复制
嵌入
classDiagram class Square~Shape~{ int id List~int~ position setPoints(List~int~ points) getPoints() List~int~ } Square : -List~string~ messages Square : +setMessages(List~string~ messages) Square : +getMessages() List~string~ Square : +getDistanceMatrix() List~List~int~~

可见性

为了描述属性或方法/函数的可见性,可以在该成员名称之前使用可选符号表示:

  • + 公开
  • - 私有
  • # 受保护
  • ~ 内部

定义关系

关系是一个通用术语,涵盖类图和对象图上发现的特定类型的逻辑连接。

                            
复制
嵌入
[classA][Arrow][ClassB]

UML为类定义了八种不同类型的关系:

类型 描述
<|-- 继承
*-- 组合
o-- 聚合
--> 关联
-- 链接(实心)
..> 依赖
..|> 实现
.. 链接(虚线)
代码:
                            
复制
嵌入
classDiagram classA <|-- classB classC *-- classD classE o-- classF classG <-- classH classI -- classJ classK <.. classL classM <|.. classN classO .. classP

我们可以使用标签来描述两个类之间关系的性质。此外,箭头也可以反向使用:

代码:
                            
复制
嵌入
classDiagram classA --|> classB : Inheritance classC --* classD : Composition classE --o classF : Aggregation classG --> classH : Association classI -- classJ : Link(Solid) classK ..> classL : Dependency classM ..|> classN : Realization classO .. classP : Link(Dashed)

关系标签

可以给关系添加标签文本:

                            
复制
嵌入
[classA][Arrow][ClassB]:LabelText
代码:
                            
复制
嵌入
classDiagram classA <|-- classB : implements classC *-- classD : composition classE o-- classF : aggregation

双向关系

双向关系在逻辑上可以表示 N:M 关联:

代码:
                            
复制
嵌入
classDiagram Animal <|--|> Zebra

语法如下:

                            
复制
嵌入
[Relation Type][Link][Relation Type]

其中 Relation Type 是以下之一:

类型 描述
<| 继承
* 组合
o 聚合
> 关联
< 关联
|> 实现

Link 是以下之一:

类型 描述
-- 实线
.. 虚线

棒棒糖界面

类还可以被赋予一个特殊的关系类型,该类型为类定义了一个棒棒糖接口。棒棒糖接口使用以下语法定义:

  • bar ()-- foo
  • foo --() bar

带有棒棒糖的界面(bar)连接到类(foo)。

注意:每个定义的接口都是唯一的,目的是不在类之间共享,也不允许多个连接指向它。

代码:
                            
复制
嵌入
classDiagram bar ()-- foo
代码:
                            
复制
嵌入
classDiagram class Class01 { int amount draw() } Class01 --() bar Class02 --() bar foo ()-- Class01

定义命名空间

命名空间对类进行分组。

代码:
                            
复制
嵌入
classDiagram namespace BaseShapes { class Triangle class Rectangle { double width double height } }

关系的基数/多重性

类图中的多重性或基数表示一个类的实例可以与另一个类的实例关联的数量。例如,每个公司都会有一名或多名员工(不能是零),而每个员工当前任职于零个或一个公司。

多重性符号放置在关联的末尾附近。

不同的基数选项是:

  • 1 只有1个
  • 0..1 0个或1个
  • 1..* 1个或多个
  • * 0个或1个或多个
  • n n(其中 n>1)
  • 0..n 0到n(其中 n>1)
  • 1..n 1到n(其中 n>1)

基数可以通过在给定箭头的前面或后面将文本选项用双引号 ”“ 括起来来轻松定义。例如:

                            
复制
嵌入
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText
代码:
                            
复制
嵌入
classDiagram Customer "1" --> "*" Ticket Student "1" --> "1..*" Course Galaxy --> "many" Star : Contains

类的注释

可以使用标记对类进行注释,以提供有关该类的附加元数据。这可以更清楚地表明类的性质。一些常见的注释包括:

  • <<Interface>> 表示一个接口类
  • <<Abstract>> 表示一个抽象类
  • <<Service>> 表示一个服务类
  • <<Enumeration>> 表示枚举

注释在开头的 << 和结尾的 >> 中进行定义。有三种方法可以向类添加注释,三种方法的输出都是相同的:

  • 内联与类定义
                            
复制
嵌入
classDiagram class Shape <<interface>>

在定义类之后的单独一行中:

代码:
                            
复制
嵌入
classDiagram class Shape <<interface>> Shape Shape : noOfVertices Shape : draw()
  • 在类定义的嵌套结构中:
代码:
                            
复制
嵌入
classDiagram class Shape{ <<interface>> noOfVertices draw() } class Color{ <<enumeration>> RED BLUE GREEN WHITE BLACK }

注释

可以在类图中输入注释,编辑器将忽略该注释。注释需要独占一行,并且必须以双百分号 (%%) 开头。直到下一行的所有文本都会被视为注释,包括任何类图语法。

代码:
                            
复制
嵌入
classDiagram %% This whole line is a comment classDiagram class Shape <<interface>> class Shape{ <<interface>> noOfVertices draw() }

设置图表的方向

你可以使用方向语句来设置类图渲染的方向:

代码:
                            
复制
嵌入
classDiagram direction RL class Student { -idCard : IdCard } class IdCard{ -id : int -name : string } class Bike{ -id : int -name : string } Student "1" --o "1" IdCard : carries Student "1" --o "1" Bike : rides

相互作用

可以为节点绑定点击事件。点击事件可以触发 JavaScript 回调函数,也可以打开一个将在新浏览器标签页中加载的链接。注意:使用 securityLevel='strict' 时禁用此功能,使用 securityLevel='loose' 时启用此功能。

你可以在所有类声明之后的单独一行上定义这些操作。

                            
复制
嵌入
action className "reference" "tooltip" click className call callback() "tooltip" click className href "url" "tooltip"
  • action 是 link 或 callback,具体取决于你想要调用的交互类型。
  • className 是与操作关联的节点 id。
  • reference 可以是 URL 链接,也可以是回调函数的名称。
  • (可选) 工具提示是当鼠标悬停在元素上时显示的字符串。
  • 回调函数将以 nodeId 作为参数被调用。

注意

可以使用 note "line1 line2" 在图表上添加注释。可以使用 note for <CLASS NAME> "line1 line2" 为特定类添加注释。

示例

代码:
                            
复制
嵌入
classDiagram note "This is a general note" note for MyClass "This is a note for a class" class MyClass{ }

网址链接:

代码:
                            
复制
嵌入
classDiagram class Shape link Shape "https://www.github.com" "This is a tooltip for a link" class Shape2 click Shape2 href "https://www.github.com" "This is a tooltip for a link"

配置

成员框

可以隐藏类节点的空成员框,这是通过更改类图配置的 hideEmptyMembersBox 值来完成的。

代码:
                            
复制
嵌入
--- config: class: hideEmptyMembersBox: true --- classDiagram class Duck