基于 Mermaid 类图规范编写: Mermaid: Class diagrams
“在软件工程中,统一建模语言 (UML) 中的类图是一种静态结构图,它通过显示系统中的类以及它们的属性和操作(或方法)再加上类之间的关系来描述系统的结构。” 维基百科
类图是面向对象建模的主要构建基础。它可以用于应用程序一般结构的概念建模,以及将模型转换为编程语言代码的详细建模。类图也可用于数据建模。类图中的类表示应用中的主要元素、交互和要编程的类。
Mermaid 可以渲染类图。
classDiagram
Animal <|-- Duck
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 IsWild
+Run()
}
classDiagram
Animal <|-- Duck
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 IsWild
+Run()
}
语法
类
UML 提供代表类成员的机制,属性和方法,以及有关它们的其他信息。每个类包含三个分区:
- 顶部分区包含类名。它以粗体和居中显示。它还可能包含描述类性质的注释文本。
- 中部分区包含类属性。它们是左对齐的。
- 底部分区包含类操作。它们也是左对齐的。
classDiagram
class BankAccount
BankAccount : +String Owner
BankAccount : +Bigdecimal Balance
BankAccount : +Deposit(Amount)
BankAccount : +Withdrawl(Amount)
classDiagram
class BankAccount
BankAccount : +String Owner
BankAccount : +Bigdecimal Balance
BankAccount : +Deposit(Amount)
BankAccount : +Withdrawl(Amount)
定义类
定义类有两种方法:
- 使用关键字 class ,如 class Animal 定义了动物类。
- 通过两个类之间的关系来定义它们。 Vehicle <|– Car 定义了两类车以及他们的关系。
classDiagram
class Animal
Vehicle <|-- Car
classDiagram
class Animal
Vehicle <|-- Car
定义类成员
UML 提供代表类成员的机制,例如属性和方法,以及有关它们的其他信息。
Mermaid 根据是否存在括号来区分属性和操作。具有的括号的被视为操作,而其他则被视为属性。
定义类成员有两种方法,无论使用哪个语法来定义成员,显示都相同。两种不同的方式是:
- 将成员和类名用冒号连接起来,每次可以定义一个成员,例如:
class BankAccount
BankAccount : +String Owner
BankAccount : +BigDecimal Balance
BankAccount : +Deposit(Amount)
BankAccount : +Withdrawal(Amount)
classDiagram
class BankAccount
BankAccount : +String Owner
BankAccount : +BigDecimal Balance
BankAccount : +Deposit(Amount)
BankAccount : +Withdrawal(Amount)
- 将成员使用大括号包裹起来,其中的成员都属于一个类,适合定义多个成员,例如:
class BankAccount {
+String Owner
+BigDecimal Balance
+Deposit(Amount)
+Withdrawl(Amount)
}
classDiagram
class BankAccount {
+String Owner
+BigDecimal Balance
+Deposit(Amount)
+Withdrawl(Amount)
}
返回值
可选地,您可以使用返回数据的类型结束操作的定义(注意:签名和返回值类型之间必须有一个空格)。
class BankAccount {
+String Owner
+BigDecimal Balance
+Deposit(Amount) bool
+Withdrawl(Amount) int
}
classDiagram
class BankAccount {
+String Owner
+BigDecimal Balance
+Deposit(Amount) bool
+Withdrawl(Amount) int
}
泛型类型
可以使用泛型类型来定义成员,对于模板参数,我们使用 ~ 来包裹(注意:目前 Mermaid 不支持嵌套模板类型)。
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~
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~
修饰
可以将这些记号放在成员名之前,来指定类成员的访问权限,但它们是可选的:
类型 | 描述 |
---|---|
+ | 公开(Public) |
– | 私有(Private) |
# | 保护(Protected) |
~ | 限制(Package/Internal/Module) |
还可以将这些符号放到成员定义之后:
类型 | 描述 |
---|---|
* | 抽象(Abstract) |
$ | 静态(Static) |
定义关系
关系是从类和对象上找到的特定逻辑连接。
[类A][箭头][类B]:标签
目前支持的不同类型之间的关系:
类型 | 描述 |
---|---|
<|– | 继承(Inheritance) |
*– | 组合(Composition) |
o– | 聚合(Aggregation) |
–> | 关联(Association) |
— | 关联(Solid Link) |
..> | 依赖(Dependency) |
..|> | 实现(Realization) |
.. | 关联(Dashed Link) |
classA <|-- classB
classC *-- classD
classE o-- classF
classG <-- classH
classI -- classJ
classK <.. classL
classM <|.. classN
classO .. classP
classDiagram
classA <|-- classB
classC *-- classD
classE o-- classF
classG <-- classH
classDiagram
classI -- classJ
classK <.. classL
classM <|.. classN
classO .. classP
我们可以使用标签来描述两个类之间关系的性质。此外,箭头也可以在相反的方向使用:
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)
classDiagram
classA --|> classB : Inheritance
classC --* classD : Composition
classE --o classF : Aggregation
classG --> classH : Association
classDiagram
classI -- classJ : Link(Solid)
classK ..> classL : Dependency
classM ..|> classN : Realization
classO .. classP : Link(Dashed)
关系的基数
类图中的基数表示与另一类实例关联的实例数。
例如,一家公司将有多个员工,但每个员工只为一家公司工作。
不同的基数选项是:
类型 | 描述 |
---|---|
1 | 有且仅有1个 |
0..1 | 最多1个 |
1..* | 1个或多个 |
* | 多个 |
n | N个(其中N大于1) |
0..n | 0至N个(其中N大于1) |
1..n | 1至N个(其中N大于1) |
可以在箭头和被关联的两个类之间添加上述符号。
[类A] "基数1" [箭头] "基数2" [类B]:标签
Customer "1" --> "*" Ticket
Student "1" --> "1..*" Course
Galaxy --> "many" Star : Contains
classDiagram
Customer "1" --> "*" Ticket
Student "1" --> "1..*" Course
Galaxy --> "many" Star : Contains
类注释
可以用特定的标记注释类,该标记就像类的元数据一样,明确说明其性质。
一些常见的注释示例可能是:
类型 | 描述 |
---|---|
<<Interface>> | 接口类 |
<<Abstract>> | 抽象类 |
<<Service>> | 服务类 |
<<Enumeration>> | 列举类 |
类注释在 << 与 >> 之间定义,有两种方法可以向类添加注释:
- 在定义类之后单独的行中。例如:
class Shape
<<interface>> Shape
- 在嵌套结构中定义。例如:
class Shape {
<<Interface>>
NoOfVertices
Draw()
}
class Color {
<<Enumeration>>
RED
BLUE
GREEN
WHITE
BLACK
}
遗憾的是我的网站似乎并不支持类注释
评论
就像程序中的注释一样,会被 Mermaid 忽略掉,以 %% 开头的行被识别为注释。
%% 这一行是 Shape 类的评论
class Shape {
<<Interface>>
NoOfVertices
Draw()
}