《设计模式:可复用面向对象软件的基础》笔记
基本信息
- 书名:Design Patterns: Elements of Reusable Object-Oriented Software
- 作者:Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides(GoF / 四人帮)
- 出版社:Addison-Wesley,1994年
- 页数:约416页(PDF 12962行)
- 来源路径:/田浩然上传的资料/电子书/[设计模式:可复用面向对象软件的基础].(Design.Patterns:Elements.of.Reusable.Object-Oriented.Software).Erich.Gamma.文字版.pdf
核心观点
设计模式的本质
设计模式不是初学者能直接想到的方案,而是经过无数次重构、重构后沉淀下来的解决方案。它们捕捉了优秀设计师的隐性经验,让后来者可以直接复用经过验证的方案。
“Design patterns capture solutions that have developed and evolved over time. Hence they aren’t the designs people tend to generate initially.”
为什么需要设计模式
- 面向对象设计很难,设计可复用的对象更难
- 新手设计师面对众多选项容易不知所措,倾向于使用熟悉的非OOP技巧
- 经验丰富的设计师知道”不要从零开始解决每个问题”,而是复用过去的成功方案
- 设计模式提供了一种通用的设计语言,让设计师能高效地沟通和复用方案
设计模式目录
全书收录 23个设计模式,分为三大类:
创建型模式(Creational Patterns,5个)
关注对象的创建机制,隐藏实例化的细节
| 模式 | 核心思想 |
|---|---|
| Abstract Factory | 提供创建一系列相关或相互依赖对象的接口,而无需指定具体类 |
| Builder | 将一个复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示 |
| Factory Method | 定义一个用于创建对象的接口,让子类决定实例化哪个类 |
| Prototype | 通过复制现有实例来创建新实例,避免子类化的创建型模式 |
| Singleton | 确保一个类只有一个实例,并提供全局访问点 |
结构型模式(Structural Patterns,7个)
关注类和对象的组合,形成更大的结构
| 模式 | 核心思想 |
|---|---|
| Adapter | 将一个类的接口转换成客户希望的另外一个接口 |
| Bridge | 将抽象部分与实现部分分离,使它们都可以独立变化 |
| Composite | 将对象组合成树形结构以表示”部分-整体”的层次结构 |
| Decorator | 动态地给一个对象添加一些额外的职责 |
| Facade | 为子系统中的一组接口提供一个一致的界面 |
| Flyweight | 运用共享技术有效地支持大量细粒度的对象 |
| Proxy | 为其他对象提供一种代理以控制对这个对象的访问 |
行为型模式(Behavioral Patterns,11个)
关注对象之间的通信和责任分配
| 模式 | 核心思想 |
|---|---|
| Chain of Responsibility | 将请求的发送者和接收者解耦,使多个对象有机会处理请求 |
| Command | 将请求封装为对象,从而使用户参数化不同的请求 |
| Interpreter | 给定一个语言,定义它的文法的一种表示,并定义一个解释器 |
| Iterator | 提供一种方法顺序访问一个聚合对象中各个元素 |
| Mediator | 用一个中介对象来封装一系列对象交互 |
| Memento | 在不破坏封装性的前提下,捕获一个对象的内部状态 |
| Observer | 定义对象间的一对多依赖关系,当一个对象状态改变时所有依赖者都收到通知 |
| State | 允许对象在内部状态改变时改变其行为 |
| Strategy | 定义一系列算法,把它们封装起来,并使它们可相互替换 |
| Template Method | 定义一个操作中的算法骨架,将一些步骤延迟到子类 |
| Visitor | 表示一个作用于某对象结构中的各元素的操作 |
描述模式的格式(标准模板)
每个模式遵循统一的描述框架:
- Pattern Name and Classification - 模式名称和分类
- Intent - 意图:模式做什么、为什么存在
- Also Known As - 别名
- Motivation - 动机:通过场景说明问题和解决方案
- Applicability - 适用性:何时使用该模式
- Structure - 结构:类图/对象图
- Participants - 参与者:参与类和对象及其职责
- Collaborations - 协作:参与者如何协同工作
- Consequences - 后果:使用模式的利弊权衡
- Implementation - 实现:实现时的陷阱和技巧
- Sample Code - 示例代码:C++或Smalltalk代码片段
- Known Uses - 已知应用:现实系统中的实例
- Related Patterns - 相关模式:与其他模式的关系
MVC中的模式应用
书中以Smalltalk MVC为例说明模式的实际应用:
- View-Controller关系 → Strategy模式
- View将组合作为个体处理 → Composite模式
- 创建默认Controller → Factory Method模式
- 为View添加滚动功能 → Decorator模式
核心关系由 Observer、Composite、Strategy 三个模式构成。
推荐阅读顺序
对于不熟悉设计模式的读者,建议从最简单的模式开始:
- Abstract Factory (第87页)
- Adapter (第139页)
- Composite (第163页)
- Decorator (第175页)
- Factory Method (第107页)
- Observer (第293页)
- Strategy (第315页)
- Template Method (第325页)
这些是最常见、最基础的模式,适用于绝大多数OO系统。
关键结论
- 设计模式是经验的重用,不是理论的创新
- 模式之间有关联,通过”Related Patterns”可以构建知识网络
- 模式有代价,每章都有Consequences讨论利弊权衡
- 不要滥用模式,模式解决的是特定问题,不是银弹
- 这本书不是用来读一遍就放书的,而是作为参考手册反复查阅
关联笔记
- SICP - 编程思想的基础
- 程序员修炼之道 - 软件工程实践
- 重构-改善既有代码的设计 - 代码改进技术
- 深入理解计算机系统 - 底层视角的设计
处理日期:2026-08-31 处理方法:PDF文本提取(markitdown) 文件状态:已完成