设计模式 vs UML
面向对象编程有两门"通用语言":设计模式教你怎么写代码 ,UML 教你怎么画代码。这篇文章帮你理清它们之间的对应关系。
一、先认识两位主角

设计模式:代码世界的"兵法三十六计"
前辈们发现,软件开发中很多问题反复出现,于是总结出 23 种经典解决方案,这就是设计模式。
它们按职责分成三大类:
| 类别 | 核心问题 | 一句话概括 | 典型代表 |
|---|---|---|---|
| 创建型 | 对象怎么造? | 把 new 这件事管起来 |
单例、工厂方法、抽象工厂、建造者、原型 |
| 结构型 | 类和对象怎么搭? | 让不同零件能拼到一起 | 适配器、装饰器、代理、组合、外观、桥接、享元 |
| 行为型 | 对象之间怎么配合? | 定义谁干什么、怎么通知 | 观察者、策略、命令、状态、模板方法、迭代器、责任链 |
记不住 23 种没关系,记住三句话就行:
创建型管"怎么造",结构型管"怎么搭",行为型管"怎么互动"。
UML:软件设计的"工程图纸"
UML(统一建模语言)用图形来描述软件系统,一共 13 种图,分两大类:
UML 13种图
|
+-------------+-------------+
| |
结构图 行为图
(画"长什么样") (画"怎么运转")
| |
类图 对象图 组件图 序列图 状态图 活动图
部署图 包图 复合结构图 用例图 通信图 时序图
交互概览图
二、核心对比:它们怎么对上?
设计模式的三类,正好能和 UML 的两大类图对应。关系是这样的:
设计模式 最适合的 UML 图
───────── ─────────────────
创建型 ──────────────► 类图(静态角色关系)
+ 序列图/活动图(创建流程)
结构型 ──────────────► 类图(继承、组合、依赖)
对象图(运行时结构)
行为型 ──────────────► 序列图(消息传递顺序)
状态图(状态切换)
活动图(业务流程)
下面展开说每种组合。
2.1 结构型模式 × 类图:天生一对
结构型模式的核心是类之间的静态关系------谁继承谁、谁包含谁、谁依赖谁。这正是类图要表达的东西。
举个例子,适配器模式用类图表达就是:
┌──────────┐ ┌──────────────┐
│ Client │────────>│ Target │ ◁── 目标接口
└──────────┘ └──────────────┘
△
│ 实现
┌──────────────┐ ┌──────────────┐
│ Adapter │────────>│ Adaptee │
└──────────────┘ └──────────────┘
适配器 被适配者
一句话:想知道一个结构型模式怎么设计的,先画类图。
装饰器、代理、组合、外观------这些模式的文档里,第一张图几乎永远是类图。
2.2 创建型模式 × 类图 + 序列图:动静结合
创建型模式有两层含义:
- 静态层面 :有哪些类参与(工厂类、产品类、客户端)→ 用类图
- 动态层面 :对象是怎么一步步创建出来的 → 用序列图 或活动图
以工厂方法为例:
类图(静态):
┌──────────────┐
│ Creator │ ◁── 工厂接口
│ +factoryMethod()│
└──────────────┘
△
│
┌───────────┴───────────┐
│ │
┌──────────────┐ ┌──────────────┐
│ConcreteCreatorA│ │ConcreteCreatorB│
└──────────────┘ └──────────────┘
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ ProductA │ │ ProductB │
└──────────────┘ └──────────────┘
序列图(动态):
Client Creator Product
│ │ │
│ create() │ │
│───────────────>│ │
│ │ new() │
│ │───────────────>│
│ │ │
│ │<───────────────│
│<───────────────│ 返回产品对象 │
│ │ │
一句话:类图告诉你"谁参与",序列图告诉你"怎么做"。
2.3 行为型模式 × 序列图 + 状态图:动态为王
行为型模式的核心是对象之间的消息传递和状态流转,所以 UML 的"行为图"系列才是它们的主场。
| 行为型模式 | 最适合的 UML 图 | 为什么 |
|---|---|---|
| 观察者模式 | 序列图 | 展示 Subject 通知 Observer 的消息链路 |
| 策略模式 | 类图 + 序列图 | 类图展示策略接口,序列图展示运行时切换 |
| 命令模式 | 序列图 | 展示 Invoker → Command → Receiver 调用链 |
| 状态模式 | 状态图 | 本来就是为状态切换设计的,完美匹配 |
| 责任链模式 | 序列图 | 展示请求沿链条传递的过程 |
状态模式 × 状态图是最经典的搭配------状态图几乎就是状态模式的可视化翻译:
┌──────────┐ 投币 ┌──────────┐
│ NoCoin │───────>│ HasCoin │
└──────────┘ └──────────┘
△ │
│ 退币 │ 出货
└────────────────────┘
一句话:行为型模式如果不画序列图/状态图,等于只看了说明书没看操作视频。
三、重点来了:13 种图不用全学
UML 有 13 种图,但理解设计模式时,真正高频使用的只有 3 种:
| 优先级 | UML 图 | 覆盖的模式 | 为什么重要 |
|---|---|---|---|
| ★★★ | 类图 | 全部 23 种 | 任何模式都有"哪些类、什么关系",类图是起点 |
| ★★★ | 序列图 | 行为型 + 部分创建型 | 对象间的消息传递,运行时视角的核心 |
| ★★ | 状态图 | 状态模式、策略模式 | 状态流转的直观表达,一图胜千言 |
其他图(活动图、通信图、组件图、部署图等)在特定场景有用,但不是理解设计模式的必修课。
四、一张总结表
| 维度 | 设计模式 | UML |
|---|---|---|
| 本质 | 解决特定问题的代码套路 | 描述系统结构的图形语言 |
| 数量 | 23 种模式 | 13 种图 |
| 分类 | 创建型 / 结构型 / 行为型 | 结构图 / 行为图 |
| 关系 | 用 UML 图来表达和沟通设计模式 | 设计模式是 UML 最常见的应用场景 |
| 入门门槛 | 需要理解面向对象三大特性 | 记住几种核心图即可上手 |
五、给初学者的建议
-
先学类图,再学模式。 看不懂类图就去啃设计模式,就像看不懂乐谱去学弹琴------能弹,但效率低。
-
每种模式至少画一张类图、一张序列图。 画完才算真懂,光看书上的图没用。
-
不用追求 23 种全记住。 单例、工厂、策略、观察者、装饰器、适配器------这 6 种占了实际开发中 80% 的场景。
-
结构型找类图,行为型找序列图。 这是最省力的学习路线。
设计模式是"答案",UML 是"答题纸"。只有答案不行,只有答题纸也不行。两者配合,才是完整的软件设计表达能力。