《设计模式:可复用面向对象软件的基础》读书笔记
书籍信息
- 作者: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides(俗称”Gang of Four”,简称GoF)
- 出版: Addison-Wesley, 1994
- 页数: 406页
- 类型: text_based(文本型PDF)
核心内容概述
本书是设计模式领域的开山之作,定义了23种经典设计模式,被誉为软件设计领域的”圣经”。
设计模式的本质
设计模式是对面向对象设计中反复出现的问题的解决方案。它不是代码,而是关于代码如何组织的思想。
“每个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案。“
设计模式的价值
- 复用设计经验:避免重复发明轮子
- 通用语言:提供一套 designers 之间的沟通语言
- 提高可维护性:使代码更容易理解和修改
- 促进灵活性:通过解耦提高系统可扩展性
23种设计模式分类
创建型模式(Creational Patterns)- 5种
关注对象的创建机制,试图以适当的方式控制对象创建。
| 模式 | 核心思想 |
|---|---|
| Abstract Factory | 提供一个创建一系列相关或依赖对象的接口,而无需指定它们具体的类 |
| Builder | 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 |
| Factory Method | 定义一个用于创建对象的接口,让子类决定实例化哪个类 |
| Prototype | 通过复制现有实例来创建新实例,而非通过构造器 |
| Singleton | 确保一个类只有一个实例,并提供全局访问点 |
典型应用:
- 系统需要独立于其产品的创建、组合和表示时 → Abstract Factory
- 产品对象有复杂的初始化需求时 → Builder
- 不知道具体要创建哪个子类的实例时 → Factory Method
结构型模式(Structural Patterns)- 7种
关注类和对象的组合,如何将类或对象结合在一起形成更大的结构。
| 模式 | 核心思想 |
|---|---|
| Adapter | 将一个类的接口转换成客户希望的另一个接口 |
| Bridge | 将抽象部分与实现部分分离,使它们都可以独立变化 |
| Composite | 将对象组合成树形结构以表示”部分-整体”的层次结构 |
| Decorator | 动态地给对象添加一些额外的职责 |
| Facade | 为子系统中的一组接口提供一个一致的界面 |
| Flyweight | 使用共享技术有效地支持大量细粒度的对象 |
| Proxy | 为其他对象提供一种代理以控制对这个对象的访问 |
典型应用:
- 接口不兼容时需要 → Adapter
- 抽象和实现需要独立变化时 → Bridge
- 需要树形结构统一处理时 → Composite
- 需要动态添加功能时 → Decorator
行为型模式(Behavioral Patterns)- 11种
关注对象之间的通信模式和职责分配。
| 模式 | 核心思想 |
|---|---|
| Chain of Responsibility | 将请求的发送者和接收者解耦,使多个对象有机会处理请求 |
| Command | 将请求封装为对象,支持参数化、队列化和日志化请求 |
| Interpreter | 为语言定义 grammar,并定义解释器来解释句子 |
| Iterator | 提供一种方法顺序访问聚合对象中的各个元素 |
| Mediator | 用一个中介对象封装一系列对象交互 |
| Memento | 在不破坏封装性的前提下捕获对象内部状态 |
| Observer | 定义对象间的一对多依赖,当一个对象改变状态时所有依赖者都会收到通知 |
| State | 允许对象在内部状态改变时改变其行为 |
| Strategy | 定义一系列算法,把它们一个个封装起来,并使它们可互相替换 |
| Template Method | 定义算法骨架,将某些步骤推迟到子类实现 |
| Visitor | 表示一个作用于某对象结构中的各元素的操作 |
典型应用:
- 需要处理请求的顺序链时 → Chain of Responsibility
- 需要支持撤销操作时 → Command
- 需要通知机制时 → Observer(事件驱动系统的核心)
- 算法可互换时 → Strategy
- 需要遍历集合时 → Iterator
核心设计理念
1. 面向接口编程
“针对接口编程,不针对实现编程”
这是 GoF 强调的核心原则。通过依赖抽象而非具体实现,提高系统的灵活性和可测试性。
2. 组合优于继承
继承虽然方便,但会破坏封装性,将类的细节实现暴露给子类。组合提供了更灵活的替代方案。
3. 最少知识原则(Law of Demeter)
只与你的直接朋友交谈,不与陌生人交谈。减少对象间的耦合。
4. 开闭原则(Open-Closed Principle)
对扩展开放,对修改关闭。通过抽象和多态实现。
经典案例:文档编辑器设计
书中通过一个完整的”文档编辑器”案例,展示了如何在实际设计中运用各种模式:
- Command模式:实现用户操作(剪切、粘贴等)的撤销/重做
- Composite模式:表示文档的树形结构
- Strategy模式:支持不同的文件格式(格式策略)
- Factory Method:创建不同类型的文档对象
- Observer模式:视图与控制器之间的通信(MVC)
模式使用的注意事项
何时使用模式
- 当你遇到需要解决的设计问题时
- 当你的设计变得复杂且难以理解时
- 当你需要增加灵活性时
- 当代码难以复用或扩展时
何时不使用模式
- 不要为了使用模式而使用模式
- 如果简单的方法就能解决问题,就不要引入模式
- 模式会增加代码复杂性,应权衡利弊
- 团队不熟悉模式时,避免过度使用
模式的局限性
- 过度设计风险:可能会引入不必要的复杂性
- 学习成本:需要时间理解模式的概念和应用场景
- 性能影响:某些模式可能引入额外的间接层
- 调试难度:模式的使用可能使调试变得更加困难
与其他设计模式资源的关联
- 《Head First 设计模式》 - 更易于入门的设计模式讲解
- 课程总复习-设计模式 - 大学课程复习笔记
- 设计模式课程-第1讲-课程概述-王亚沙 - 设计模式课程讲义
可行动点
- 深入学习23种核心模式:每种模式都要理解其适用场景、优缺点和实现方式
- 在实践中识别模式:阅读现有代码时尝试识别其中使用的模式
- 建立自己的模式库:将常用模式整理成可复用的代码模板
- 参与开源项目:在实际项目中观察和学习设计模式的应用
- 定期回顾:随着经验增长,对模式的理解会不断深化
总结
《设计模式:可复用面向对象软件的基础》是软件设计领域的经典之作。它定义了23种设计模式,为面向对象设计提供了一套通用的语言和解决方案。
核心价值在于:
- 知识沉淀:将优秀的设计经验系统化
- 沟通工具:提供设计师之间的共同语言
- 问题解决:提供经过验证的解决方案模板
但需要注意:模式是工具而非目的,应根据实际问题和需求灵活运用,避免为了模式而模式。
本书是设计模式领域的奠基之作,适合有一定面向对象编程经验的开发者阅读。建议结合实际项目经验反复阅读,每次都会有新的理解。