设计模式 vs UML

设计模式 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 最常见的应用场景
入门门槛 需要理解面向对象三大特性 记住几种核心图即可上手

五、给初学者的建议

  1. 先学类图,再学模式。 看不懂类图就去啃设计模式,就像看不懂乐谱去学弹琴------能弹,但效率低。

  2. 每种模式至少画一张类图、一张序列图。 画完才算真懂,光看书上的图没用。

  3. 不用追求 23 种全记住。 单例、工厂、策略、观察者、装饰器、适配器------这 6 种占了实际开发中 80% 的场景。

  4. 结构型找类图,行为型找序列图。 这是最省力的学习路线。


设计模式是"答案",UML 是"答题纸"。只有答案不行,只有答题纸也不行。两者配合,才是完整的软件设计表达能力。