《设计模式:可复用面向对象软件的基础》读书笔记

书籍信息

  • 作者: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides(俗称”Gang of Four”,简称GoF)
  • 出版: Addison-Wesley, 1994
  • 页数: 406页
  • 类型: text_based(文本型PDF)

核心内容概述

本书是设计模式领域的开山之作,定义了23种经典设计模式,被誉为软件设计领域的”圣经”。

设计模式的本质

设计模式是对面向对象设计中反复出现的问题的解决方案。它不是代码,而是关于代码如何组织的思想。

“每个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案。“

设计模式的价值

  1. 复用设计经验:避免重复发明轮子
  2. 通用语言:提供一套 designers 之间的沟通语言
  3. 提高可维护性:使代码更容易理解和修改
  4. 促进灵活性:通过解耦提高系统可扩展性

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)

模式使用的注意事项

何时使用模式

  • 当你遇到需要解决的设计问题时
  • 当你的设计变得复杂且难以理解时
  • 当你需要增加灵活性时
  • 当代码难以复用或扩展时

何时不使用模式

  • 不要为了使用模式而使用模式
  • 如果简单的方法就能解决问题,就不要引入模式
  • 模式会增加代码复杂性,应权衡利弊
  • 团队不熟悉模式时,避免过度使用

模式的局限性

  1. 过度设计风险:可能会引入不必要的复杂性
  2. 学习成本:需要时间理解模式的概念和应用场景
  3. 性能影响:某些模式可能引入额外的间接层
  4. 调试难度:模式的使用可能使调试变得更加困难

与其他设计模式资源的关联

可行动点

  1. 深入学习23种核心模式:每种模式都要理解其适用场景、优缺点和实现方式
  2. 在实践中识别模式:阅读现有代码时尝试识别其中使用的模式
  3. 建立自己的模式库:将常用模式整理成可复用的代码模板
  4. 参与开源项目:在实际项目中观察和学习设计模式的应用
  5. 定期回顾:随着经验增长,对模式的理解会不断深化

总结

《设计模式:可复用面向对象软件的基础》是软件设计领域的经典之作。它定义了23种设计模式,为面向对象设计提供了一套通用的语言和解决方案。

核心价值在于:

  1. 知识沉淀:将优秀的设计经验系统化
  2. 沟通工具:提供设计师之间的共同语言
  3. 问题解决:提供经过验证的解决方案模板

但需要注意:模式是工具而非目的,应根据实际问题和需求灵活运用,避免为了模式而模式。


本书是设计模式领域的奠基之作,适合有一定面向对象编程经验的开发者阅读。建议结合实际项目经验反复阅读,每次都会有新的理解。