前言
UML(Unified Modeling Language, 统一建模语言)是用于显示类层次结构、子系统交互和序列图等的行业图形标准。
一、ULM图形的集合
- 结构UML图
- 类图 ✅
- 对象图
- 包图
- 组合结构图
- 构建图
- 部署图
- Profile图
- 行为UML图
- 用例图
- 活动图
- 状态机图
- 交互图
- 顺序图✅
- 通讯图
- 定时图
- 交互概览图
二、类图
#mermaid-svg-6IgSdwwJlUn1Skip{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-6IgSdwwJlUn1Skip .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-6IgSdwwJlUn1Skip .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-6IgSdwwJlUn1Skip .error-icon{fill:#552222;}#mermaid-svg-6IgSdwwJlUn1Skip .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6IgSdwwJlUn1Skip .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-6IgSdwwJlUn1Skip .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6IgSdwwJlUn1Skip .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6IgSdwwJlUn1Skip .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-6IgSdwwJlUn1Skip .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6IgSdwwJlUn1Skip .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6IgSdwwJlUn1Skip .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6IgSdwwJlUn1Skip .marker.cross{stroke:#333333;}#mermaid-svg-6IgSdwwJlUn1Skip svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6IgSdwwJlUn1Skip p{margin:0;}#mermaid-svg-6IgSdwwJlUn1Skip g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-6IgSdwwJlUn1Skip g.classGroup text .title{font-weight:bolder;}#mermaid-svg-6IgSdwwJlUn1Skip .cluster-label text{fill:#333;}#mermaid-svg-6IgSdwwJlUn1Skip .cluster-label span{color:#333;}#mermaid-svg-6IgSdwwJlUn1Skip .cluster-label span p{background-color:transparent;}#mermaid-svg-6IgSdwwJlUn1Skip .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-6IgSdwwJlUn1Skip .cluster text{fill:#333;}#mermaid-svg-6IgSdwwJlUn1Skip .cluster span{color:#333;}#mermaid-svg-6IgSdwwJlUn1Skip .nodeLabel,#mermaid-svg-6IgSdwwJlUn1Skip .edgeLabel{color:#131300;}#mermaid-svg-6IgSdwwJlUn1Skip .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-6IgSdwwJlUn1Skip .label text{fill:#131300;}#mermaid-svg-6IgSdwwJlUn1Skip .labelBkg{background:#ECECFF;}#mermaid-svg-6IgSdwwJlUn1Skip .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-6IgSdwwJlUn1Skip .classTitle{font-weight:bolder;}#mermaid-svg-6IgSdwwJlUn1Skip .node rect,#mermaid-svg-6IgSdwwJlUn1Skip .node circle,#mermaid-svg-6IgSdwwJlUn1Skip .node ellipse,#mermaid-svg-6IgSdwwJlUn1Skip .node polygon,#mermaid-svg-6IgSdwwJlUn1Skip .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6IgSdwwJlUn1Skip .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-6IgSdwwJlUn1Skip g.clickable{cursor:pointer;}#mermaid-svg-6IgSdwwJlUn1Skip g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-6IgSdwwJlUn1Skip g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-6IgSdwwJlUn1Skip .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-6IgSdwwJlUn1Skip .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-6IgSdwwJlUn1Skip .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-6IgSdwwJlUn1Skip .dashed-line{stroke-dasharray:3;}#mermaid-svg-6IgSdwwJlUn1Skip .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-6IgSdwwJlUn1Skip #compositionStart,#mermaid-svg-6IgSdwwJlUn1Skip .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-6IgSdwwJlUn1Skip #compositionEnd,#mermaid-svg-6IgSdwwJlUn1Skip .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-6IgSdwwJlUn1Skip #dependencyStart,#mermaid-svg-6IgSdwwJlUn1Skip .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-6IgSdwwJlUn1Skip #dependencyStart,#mermaid-svg-6IgSdwwJlUn1Skip .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-6IgSdwwJlUn1Skip #extensionStart,#mermaid-svg-6IgSdwwJlUn1Skip .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-6IgSdwwJlUn1Skip #extensionEnd,#mermaid-svg-6IgSdwwJlUn1Skip .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-6IgSdwwJlUn1Skip #aggregationStart,#mermaid-svg-6IgSdwwJlUn1Skip .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-6IgSdwwJlUn1Skip #aggregationEnd,#mermaid-svg-6IgSdwwJlUn1Skip .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-6IgSdwwJlUn1Skip #lollipopStart,#mermaid-svg-6IgSdwwJlUn1Skip .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-6IgSdwwJlUn1Skip #lollipopEnd,#mermaid-svg-6IgSdwwJlUn1Skip .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-6IgSdwwJlUn1Skip .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-6IgSdwwJlUn1Skip .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-6IgSdwwJlUn1Skip .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-6IgSdwwJlUn1Skip .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-6IgSdwwJlUn1Skip :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 继承
继承
接口实现
聚合
组合
关联,双向聚合
依赖
1*
1*
1
N
N
N
Derived1
-String readerId
-String name
-int maxBorrowCount
+borrowBook(Book book)
+returnBook(Book book)
Derived2
-String recordId
-Date borrowDate
-Date returnDate
+extendDueDate(int days)
BaseClass
-String isbn
-String title
-String author
-boolean isAvailable
+setAvailableStatus(boolean status)
<<interface>>
interface
-
fun(a:int) : void
Class
Component
Container
Factory┌─────────────────┬───────────────┬───────────────────────┬───────────────────────────────────┐
│ 箭头样式 │ PlantUML 语法 │ UML 含义 │ 图示 │
├─────────────────┼───────────────┼───────────────────────┼───────────────────────────────────┤
│ 实线 + 空心三角 │ <|-- │ 继承 (Inheritance) │ 子类 → 父类 │
├─────────────────┼───────────────┼───────────────────────┼───────────────────────────────────┤
│ 虚线 + 空心三角 │ <|.. │ 实现 (Implementation) │ 实现类 → 接口 │
├─────────────────┼───────────────┼───────────────────────┼───────────────────────────────────┤
│ 实线 + 实心菱形 │ *-- │ 组合 (Composition) │ 整体 → 部分(强拥有,同生命周期) │
├─────────────────┼───────────────┼───────────────────────┼───────────────────────────────────┤
│ 实线 + 实心箭头 │ --> │ 关联 (Association) │ 使用者 → 被使用者 │
├─────────────────┼───────────────┼───────────────────────┼───────────────────────────────────┤
│ 虚线 + 实心箭头 │ ..> │ 依赖 (Dependency) │ 使用者 → 被使用者(弱依赖) │
└─────────────────┴───────────────┴───────────────────────┴───────────────────────────────────┘
关联 vs 聚合 vs 组合:本质区别
关联 (-->) 聚合 (o--) 组合 (*--)
"I know about you" "I contain you, but loosely" "I own you, lifecycle tied"
关联------持有指针或引用,无所有权,无生命周期约束。被关联的对象完全可以独立存在,关联方只是"知道"它、调用它。
聚合比关联多了一层语义:强调整体-部分关系,但部分可以脱离整体存在(空心菱形)。比如 球队 o-- 球员:球队由球员组成,但球员离开球队仍然存在。
组合则是强所有权:部分的生命周期绑定在整体上(实心菱形),整体销毁时部分也销毁。
聚合在工程实践中用得很少,因为"可共享的包含"这个语义边界模糊。许多 UML 实践中直接跳过聚合,只在两种关系中二选一:
- 就是指针/引用 → 关联 (-->)
- 就是拥有/掌控生命周期 → 组合 (*--)
三、顺序图
或者也叫时序图,顺序图以图形方式表示在不同对象之间发送哪些消息以及这些消息的发送顺序。包含以下组件
- 对象:交互中涉及的对象实例
- 生命线: 图形化表示的对象声明周期
- 消息:消息又一个对象发送给另一个对象
- 回复:当对象收到另一个对象的消息时,会发送一个回复
- 自我消息:对象发送给自己的消息
- 选择:表示选择流

总结
本文从 UML 的基本概念出发,首先梳理了 UML 图形的两大类------结构图 和行为图,帮助建立整体认知框架。
接着重点介绍了两种最常用的 UML 图:
- 类图(Class Diagram):用于描述系统中的类、接口及其之间的静态关系(继承、实现、聚合、组合、关联、依赖)。通过 Mermaid 示例,直观展示了如何用类图建模图书管理系统中的核心实体与关系。
- 顺序图(Sequence Diagram):用于描述对象之间消息交互的时间顺序,核心组件包括对象、生命线、消息、回复、自我消息和选择等。顺序图是理解系统动态行为的重要工具。
类图回答"系统由哪些类组成、它们之间是什么关系",顺序图回答"某个场景下对象之间如何协作"------两者结合,能够有效支撑面向对象系统分析与设计。