PlantUML 类图:关系、语法与示例
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 为 interface、abstract class 和 enum 提供了专用声明。当这些区别有助于读者理解可替换性或受限取值时,请使用它们。
@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 架构指南。
如果要展示 CheckoutService 与 PaymentGateway 之间的运行时交互,可将这个静态视图链接到 PlantUML 时序图教程。两个相互关联的小图通常比一个超载的大图更清晰。
类图常见错误
| 问题 | 后果 | 修正方式 |
|---|---|---|
| 所有强关系都使用组合 | 生命周期所有权失去意义 | 询问部分能否在整体消失后继续存在 |
| 列出所有代码成员 | 图表变成难以阅读的代码转储 | 只包含与当前视图相关的成员 |
| 缺少多重性 | 读者会自行推断出不同基数 | 数量重要时标注两端 |
| 混用依赖和关联 | 临时使用看起来像持久状态 | 使用 ..> 表示依赖 |
| 包盲目照搬文件夹 | 技术布局取代领域含义 | 围绕正在评审的问题分组 |
| 将渲染图表视为证明 | 错误模型获得虚假权威性 | 与领域和实现负责人共同验证 |
常见问题解答
*-- 和 o-- 有什么区别?
*-- 表示组合,其中部分的生命周期依赖整体。o-- 表示聚合,其中部分可以独立存在。正确选择取决于领域的生命周期语义。
如何展示 Java 接口实现?
声明一个 interface 和实现类,然后用 <|.. 连接两者,并让箭头指向接口。
@startuml
interface Repository
class SqlRepository
Repository <|.. SqlRepository
@enduml
PlantUML 可以根据图表生成类吗?
PlantUML 的文档定位是根据文本渲染图表。代码生成或逆向工程依赖其他工具和集成,请核实你所使用工具链的具体能力。
可以在哪里比较 Mermaid 和 PlantUML 类图?
选择图表语言时,请参阅现有的 Mermaid 与 PlantUML 类图对比。
后续步骤
复制电子商务示例,删除所有无助于回答当前设计问题的类型。然后与熟悉领域的人确认多重性和生命周期所有权。
接下来可继续查看 PlantUML 示例中心、时序图指南或 PlantUML C4 架构图。官方类图参考还记录了泛型、注释、命名空间和高级显示选项等语法。PlantUML 的通用命令参考涵盖可在不同图表类型中共用的标题、图注、图例、页眉和页脚。
如果评审问题关注的是具体运行时实例,而不是类型定义,在向类图添加实例数据之前,请对照 PlantUML 官方的对象图指南。