软件结构建模

Mermaid 类图在线编辑器

用 Mermaid 类图评审软件类型及其关系。添加关键成员,区分继承与所有权,并标注多重性,再导出用于设计讨论的模型。

在线创建 Mermaid 类图

参考下方订单与订单项示例,通过预览检查箭头方向、成员可见性和所有权关系。

OnUML
Loading diagram preview...

明确软件设计中的类型与结构关系

类图描述软件类型与行为。如果主要讨论持久化实体、键和数据库关系,使用 ER 图更合适。

属性与操作

只列出能解释职责或契约的字段与方法。

可见性标记

用 +、-、# 和 ~ 表示公开、私有、受保护和包级可见性。

继承与接口

区分泛化和实现关系,避免混淆子类继承与接口实现。

所有权与多重性

选择组合、聚合或关联,并说明关系两端允许多少个对象。

创建一张目标明确的软件结构图

先明确设计问题,不需要把代码中的全部成员复制到类图。

  1. 01

    声明 classDiagram,添加相关类,并在类块内列出关键属性或方法。

  2. 02

    根据设计选择关系符号,需要表达数量约束时添加带引号的多重性。

  3. 03

    在预览中逐条检查箭头与所有权关系,再导出或保存供评审使用。

成员与关系的类图语法

箭头和菱形都表达含义。请检查关系属于哪一端,不要只根据线条外观选择符号。

Mermaid 类图语法参考 →

成员与返回类型

带括号的成员表示操作,返回类型写在右括号之后。需要表达契约时,在成员前添加可见性标记。

classDiagram
    class Invoice {
        +String id
        -Decimal balance
        +pay() Receipt
    }

继承与接口实现

Base <|-- Child 的三角形指向基类。接口实现使用虚线关系,并显式标记接口。

classDiagram
    class PaymentMethod {
        <<interface>>
        +pay() Receipt
    }
    PaymentMethod <|.. CardPayment
    LineItem <|-- DigitalLineItem

组合、聚合与依赖

实心菱形表示组合,空心菱形表示聚合,菱形位于整体的一端。虚线依赖箭头表示一个类型使用另一个类型。

classDiagram
    Order *-- LineItem : 包含
    Team o-- Member : 分组
    CheckoutService ..> PaymentMethod : 使用

关系两端的多重性

数量约束用引号包住。这里每张订单属于一个客户,客户可以没有订单,也可以有多张订单。

classDiagram
    Customer "1" --> "0..*" Order : 下单
    Order "1" *-- "1..*" LineItem : 包含

Mermaid 类图示例

Order 包含一个或多个 LineItem,DigitalLineItem 继承 LineItem 并增加下载地址,各类只列出解释模型所需的成员。

classDiagram
    class Order["订单"] {
        +String id
        +OrderStatus status
        +total() Decimal
    }
    class LineItem["订单项"] {
        +String sku
        +int quantity
        +subtotal() Decimal
    }
    class DigitalLineItem["数字订单项"] {
        +String downloadUrl
    }
    Order "1" *-- "1..*" LineItem : 包含
    LineItem <|-- DigitalLineItem
  • Order 一端的菱形表达图中选择的订单项所有权模型。
  • 继承三角形指向更一般的类型 LineItem。
  • 尝试添加实体商品订单项子类,先判断是否需要继承,再增加成员。

常见问题

继承箭头应该指向哪一端?

三角形指向父类或基类。Base <|-- Child 表示 Child 继承 Base。

如何表示接口?

在接口声明中添加 <<interface>>,并使用实现关系,例如 PaymentMethod <|.. CardPayment。

组合与聚合有什么区别?

组合用实心菱形表达较强的整体与部分所有权,聚合用空心菱形表达较弱的整体与部分关系。请按实际生命周期选择,不要把每个集合都视为组合。

如何写一对多关系?

在两端写带引号的多重性,例如 Customer "1" --> "0..*" Order。如果至少需要一个关联对象,则使用 1..*。

为什么成员被显示成方法?

Mermaid 通过括号区分操作。属性声明不带括号,操作可写成 method() ReturnType。

如何给关系添加标签?

在连线后写冒号和简短标签,例如 Order *-- LineItem : 包含。用动词解释关系,多重性仍写在关系两端。

深入比较

比较 Mermaid 与 PlantUML 类图

了解 Mermaid 适合轻量结构说明的场景,以及何时需要 PlantUML 更完整的 UML 建模能力。

阅读类图对比指南 →