使用Mermaid语法画UML类图


Mermaid

Mermaid 可让您使用文本和代码创建图表和可视化效果。它是一种基于 Javascript 的图表和图表工具,可呈现受 Markdown 启发的文本定义以动态创建和修改图表。

UML类图

在软件工程中,统一建模语言(UML)中的类图是一种静态结构图,它通过显示系统的类,其属性,操作(或方法)以及对象之间的关系来描述系统的结构。

类图语法

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。这定义了两个类Vehicle和Car及其关系。
classDiagram
    class Animal
    Vehicle <|-- Car
classDiagram class Animal Vehicle <|-- Car

命名约定:类名应由字母数字(允许使用Unicode)和下划线字符组成。

定义类成员

UML提供了表示类成员的机制,例如属性和方法,以及有关它们的其他信息。

Mermaid根据括号 ()是否存在来区分属性和函数/方法。与一起()被视为函数/方法,而其他被视为属性。

有两种定义类成员的方法,无论使用哪种语法定义成员,输出都将相同。两种不同的方式是:

  • 使用:(冒号)后跟成员名称来关联一个类的成员,这对于一次定义一个成员非常有用。例如:
classDiagram
    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)
  • 使用{}括号关联类的成员,其中成员分组在大括号中。适合一次定义多个成员。例如:
classDiagram
    class BankAccount{
        +String owner
        +BigDecimal balance
        +deposit(amount) bool
        +withdrawl(amount)
    }
classDiagram class BankAccount{ +String owner +BigDecimal balance +deposit(amount) bool +withdrawl(amount) }

返回类型

(可选)您可以使用将要返回的数据类型结束方法/函数定义(注意:)方法定义的末尾和返回类型示例之间必须有一个空格:

classDiagram
    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 }

泛型

List<int>通过将类型包含在~tilde)中,可以使用通用类型(例如)针对字段,参数和返回类型定义成员。注意:目前不支持嵌套类型声明(例如List<List<int>>

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~
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~

可见性

要指定类成员(即任何属性或方法)的可见性,这些符号可以放在成员名之前,但它是可选的:

可见性 Java UML
对所有类可见(公共的) public +
仅对本类可见(私有的) private -
对本包和所有子类可见(受保护的) protected #
对本包可见(包内部) 默认,不需要修饰符 _

请注意,您还可以通过在方法的末尾添加以下符号来为方法定义添加其他分类器,即()

  • * 抽象,例如: someAbstractMethod()*
  • $ 静态,例如: someStaticMethod()$

定义关系

image-20210131215955785

描述 描述 说明
<|-- Inheritance 继承 一般而言,如果类A扩展类B,类A不但包含从类B继承的方法,还会拥有一些额外的功能。
*-- Composition 组合
o-- Aggregation 聚合 聚合关系意味着类A 的对象包含类B 的对象。
--> Association 单向关联
-- Link (Solid) 双向关联
..> Dependency 依赖 如果一个类的方法操纵另一个类的对象, 我们就说一个类依赖于另一个类。
..|> Realization 实现
.. Link (Dashed)
classDiagram
    classA --|> classB : 继承
    classC --* classD : 组合
    classE --o classF : 聚合
    classG --> classH : 单向关联
    classI -- classJ : 双向关联
    classK ..> classL : 依赖
    classM ..|> classN : 接口实现
    classO .. classP : Link(Dashed)
classDiagram classA --|> classB : 继承 classC --* classD : 组合 classE --o classF : 聚合 classG --> classH : 单向关联 classI -- classJ : 双向关联 classK ..> classL : 依赖 classM ..|> classN : 接口实现 classO .. classP : Link(Dashed)

多重关系

类图中的多样性或基数表示一个类与另一个类的一个实例相链接的实例的数量。例如,一个公司将有一个或多个雇员,但是每个雇员只为一个公司工作。

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

不同的基数选项是:

  • 1 只有1个
  • 0..1 零或一
  • 1..* 一个或多个
  • * 许多
  • n n {其中n> 1}
  • 0..n 0至n {其中n> 1}
  • 1..n 1至n{其中n> 1}

基数可以很容易地定义,方法是将基数文本放在引号内“在(可选)一个给定箭头之前(可选)和(可选)之后”。

classDiagram
    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>> 代表一个枚举

注释定义在开头<<和结尾>>中。有两种方法可以向类添加注释,并且无论使用什么语法,输出都是相同的。这两种方式是:

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

classDiagram
class Shape
<<interface>> Shape
classDiagram class Shape <<interface>> Shape

在一个嵌套结构中,以及类定义。例如:

classDiagram
class Shape{
    <<interface>>
    noOfVertices
    draw()
}
class Color{
    <<enumeration>>
    RED
    BLUE
    GREEN
    WHITE
    BLACK
}
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 %% This whole line is a comment classDiagram class Shape <<interface>> class Shape{ <<interface>> noOfVertices draw() }

参考资料

https://mermaid-js.github.io/mermaid/#/classDiagram


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM