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