使用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