PlantUML 类图:关系、语法与示例

··Updated ·6 min read
plantuml类图uml领域建模

PlantUML 类图描述系统的静态结构:类型、成员及其关系。你以文本形式编写声明和连接线,再由 PlantUML 完成布局。本教程通过构建电子商务模型,讲解可见性、继承、实现、依赖、聚合、组合和多重性。

如需浏览其他图表类型,请先查看 PlantUML 示例。如果你主要关注随时间发生的行为,PlantUML 时序图指南会是更好的起点。

要点总结

  • 类图回答的是“存在哪些事物,它们如何关联?”,而不是“接下来会发生什么?”
  • <|--<|..*--o--..> 分别表达不同的关系语义。
  • 组合与聚合应反映生命周期所有权,而非视觉偏好。
  • 关系端点处的引号标签用于表达多重性,例如 "1""0..*"
  • PlantUML 可以渲染模型,但无法判断模型对你的领域是否正确。

前置条件

打开 OnUML 编辑器,选择 PlantUML 模式,然后将各个示例粘贴到源代码编辑器中。OnUML 会在浏览器工作流中生成预览,因此无需本地渲染器或编程语言。需要日后继续编辑时,请登录并保存 OnUML 项目。示例遵循官方 PlantUML 类图文档(检索于 2026 年 7 月 24 日)。

第 1 步:定义包含字段和方法的类

将成员放在花括号内。可见性符号分别是:+ 表示 public、- 表示 private、# 表示 protected、~ 表示 package-private。

@startuml
class Product {
  -id: UUID
  -name: String
  -price: Money
  +changePrice(newPrice: Money): void
  +isAvailable(): Boolean
}
@enduml

这种表示法用于记录设计意图,本身不会生成或检查应用代码。请选择一致的成员格式,并避免用没有架构信息的访问器填满图表。

第 2 步:添加接口、抽象类和枚举

PlantUML 为 interfaceabstract classenum 提供了专用声明。当这些区别有助于读者理解可替换性或受限取值时,请使用它们。

@startuml
interface PaymentGateway {
  +authorize(amount: Money): Authorization
  +capture(id: UUID): Receipt
}

abstract class Payment {
  #amount: Money
  +process(): PaymentResult
}

class CardPayment
class BankTransfer

enum PaymentStatus {
  PENDING
  AUTHORIZED
  CAPTURED
  FAILED
}

Payment <|-- CardPayment
Payment <|-- BankTransfer
PaymentGateway <|.. CardPayment
Payment --> PaymentStatus
@enduml

<|-- 从子类型指向父类型。<|.. 使用虚线表示接口实现。整篇文章或整个项目应保持箭头方向一致,避免读者在每个视图中重新理解。

第 3 步:选择正确的关系

关系应传达领域含义:

PlantUML 语法常见含义决策问题
`Parent <-- Child`继承
`Interface <.. Type`接口实现
Whole *-- Part组合部分的生命周期是否依赖整体?
Whole o-- Part聚合部分能否独立存在?
A --> B有向关联A 是否保留或导航到 B?
A ..> B依赖A 是否临时使用 B?

官方类图指南以部分能否脱离整体独立存在来区分组合与聚合。但真实领域仍可能存在歧义。例如,订单行可以组合到订单中,而该订单行所引用的商品则可独立存在。

@startuml
class Order
class OrderLine
class Product
class PricingService

Order "1" *-- "1..*" OrderLine : contains
OrderLine "*" --> "1" Product : references
Order ..> PricingService : requests price from
@enduml

第 4 步:表达多重性

将多重性标签放在各端点旁的引号内。常见值包括 "1""0..1""*""1..*"

@startuml
class Customer
class Address
class Order
class OrderLine
class Product

Customer "1" o-- "0..*" Address : stores
Customer "1" --> "0..*" Order : places
Order "1" *-- "1..*" OrderLine : contains
OrderLine "*" --> "1" Product : selects
@enduml

Order "1" *-- "1..*" OrderLine 表示一个订单拥有一条或多条订单行。该符号描述的是拟议模型,并非已经验证的数据库约束。如果文档主要用于说明存储规则,请使用 PlantUML ER 图的实体和基数

第 5 步:组织更大的领域

包可以减轻视觉负担并传达边界。下面的完整模型区分了订单、目录和支付概念。

@startuml
title E-commerce domain model
left to right direction

package Ordering {
  class Customer {
    +id: UUID
    +email: String
  }

  class Order {
    +number: String
    +status: OrderStatus
    +total(): Money
  }

  class OrderLine {
    +quantity: Integer
    +unitPrice: Money
    +subtotal(): Money
  }

  enum OrderStatus {
    DRAFT
    PLACED
    PAID
    CANCELLED
  }
}

package Catalog {
  class Product {
    +sku: String
    +name: String
    +price: Money
  }
}

package Payments {
  interface PaymentGateway {
    +authorize(orderId: UUID, amount: Money): Authorization
  }

  class CheckoutService {
    +checkout(order: Order): Receipt
  }
}

Customer "1" --> "0..*" Order : places
Order "1" *-- "1..*" OrderLine : contains
OrderLine "*" --> "1" Product : references
Order --> OrderStatus
CheckoutService ..> Order : processes
CheckoutService ..> PaymentGateway : uses
@enduml

该图有意省略控制器、仓储和框架类。领域视图突出业务概念时更有价值。如果基础设施选择才是实际评审主题,请创建单独的实现视图。

类图与 C4 架构图有什么关系?

类图深入到类型级结构。C4 架构图通常从更高层开始,展示人员、系统、容器和组件。当利益相关者需要先理解边界与职责,再查看类时,请使用 PlantUML C4 架构指南

如果要展示 CheckoutServicePaymentGateway 之间的运行时交互,可将这个静态视图链接到 PlantUML 时序图教程。两个相互关联的小图通常比一个超载的大图更清晰。

类图常见错误

问题后果修正方式
所有强关系都使用组合生命周期所有权失去意义询问部分能否在整体消失后继续存在
列出所有代码成员图表变成难以阅读的代码转储只包含与当前视图相关的成员
缺少多重性读者会自行推断出不同基数数量重要时标注两端
混用依赖和关联临时使用看起来像持久状态使用 ..> 表示依赖
包盲目照搬文件夹技术布局取代领域含义围绕正在评审的问题分组
将渲染图表视为证明错误模型获得虚假权威性与领域和实现负责人共同验证

常见问题解答

*--o-- 有什么区别?

*-- 表示组合,其中部分的生命周期依赖整体。o-- 表示聚合,其中部分可以独立存在。正确选择取决于领域的生命周期语义。

如何展示 Java 接口实现?

声明一个 interface 和实现类,然后用 <|.. 连接两者,并让箭头指向接口。

@startuml
interface Repository
class SqlRepository
Repository <|.. SqlRepository
@enduml

PlantUML 可以根据图表生成类吗?

PlantUML 的文档定位是根据文本渲染图表。代码生成或逆向工程依赖其他工具和集成,请核实你所使用工具链的具体能力。

可以在哪里比较 Mermaid 和 PlantUML 类图?

选择图表语言时,请参阅现有的 Mermaid 与 PlantUML 类图对比

后续步骤

复制电子商务示例,删除所有无助于回答当前设计问题的类型。然后与熟悉领域的人确认多重性和生命周期所有权。

接下来可继续查看 PlantUML 示例中心、时序图指南或 PlantUML C4 架构图。官方类图参考还记录了泛型、注释、命名空间和高级显示选项等语法。PlantUML 的通用命令参考涵盖可在不同图表类型中共用的标题、图注、图例、页眉和页脚。

如果评审问题关注的是具体运行时实例,而不是类型定义,在向类图添加实例数据之前,请对照 PlantUML 官方的对象图指南