类图描述系统的静态结构:有哪些类型、各自承担什么职责,以及类型之间如何依赖。不要把每个字段和私有辅助方法都搬进图中。
类与成员
跳转到“类与成员”classDiagram class Task { +String id +TaskState state +start() void +complete(result) void }常见可见性:+ 公有、- 私有、# 受保护、~ 包内可见。返回类型写在方法签名末尾。
关系
跳转到“关系”| 关系 | Mermaid | 含义 | |
|---|---|---|---|
| 继承 | `Base < | — Derived` | Derived 是 Base 的一种 |
| 实现 | `Interface < | .. Implementation` | 类型实现接口契约 |
| 组合 | Owner *-- Part | Part 生命周期由 Owner 管理 | |
| 聚合 | Whole o-- Part | Whole 引用可独立存在的 Part | |
| 关联 | A --> B | A 持有或导航到 B | |
| 依赖 | A ..> B | A 临时使用 B |
只有在生命周期语义明确时才区分组合和聚合。无法确认时,用普通关联或依赖更诚实。
完整示例
跳转到“完整示例”classDiagram class TaskService { +execute(taskId) Result } class TaskRepository { +find(taskId) Task +save(task) void } class Task { +String id +TaskState state +complete(result) void } class Result
TaskService --> TaskRepository : loads and saves TaskRepository o-- "0..*" Task Task *-- "0..1" Result关系标签写“为什么依赖”,不要只重复类型名称。多重性放在关系端点附近,例如 "1"、"0..1"、"0..*"。
绘图检查
跳转到“绘图检查”- 图是否只表达一个层级和一个问题?
- 依赖箭头方向是否与代码中的调用或持有关系一致?
- 组合关系是否真的意味着共同生命周期?
- 名称是否与代码、接口和正文一致?
- 删除实现细节后,设计意图是否仍然清晰?
来源:CSDN 原文,首次发布于 2025-03-28。