Mermaid UML 类图规范

基于 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()
}

语法

UML 提供代表类成员的机制,属性和方法,以及有关它们的其他信息。每个类包含三个分区:

  • 顶部分区包含类名。它以粗体和居中显示。它还可能包含描述类性质的注释文本。
  • 中部分区包含类属性。它们是左对齐的。
  • 底部分区包含类操作。它们也是左对齐的。
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

定义类成员

UML 提供代表类成员的机制,例如属性和方法,以及有关它们的其他信息。
Mermaid 根据是否存在括号来区分属性和操作。具有的括号的被视为操作,而其他则被视为属性。
定义类成员有两种方法,无论使用哪个语法来定义成员,显示都相同。两种不同的方式是:

  • 将成员和类名用冒号连接起来,每次可以定义一个成员,例如:
class BankAccount
BankAccount : +String Owner
BankAccount : +BigDecimal Balance
BankAccount : +Deposit(Amount)
BankAccount : +Withdrawal(Amount)
  • 将成员使用大括号包裹起来,其中的成员都属于一个类,适合定义多个成员,例如:
class BankAccount {
    +String Owner
    +BigDecimal Balance
    +Deposit(Amount)
    +Withdrawl(Amount)
}

返回值

可选地,您可以使用返回数据的类型结束操作的定义(注意:签名和返回值类型之间必须有一个空格)。

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~

修饰

可以将这些记号放在成员名之前,来指定类成员的访问权限,但它们是可选的:

类型 描述
+ 公开(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

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

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)

类图关系总结

关系的基数

类图中的基数表示与另一类实例关联的实例数。
例如,一家公司将有多个员工,但每个员工只为一家公司工作。
不同的基数选项是:

类型 描述
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

类注释

可以用特定的标记注释类,该标记就像类的元数据一样,明确说明其性质。
一些常见的注释示例可能是:

类型 描述
<<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()
}

发表评论