← 全部书单 / 软件工程

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

《设计模式:可复用面向对象软件的基础》封面
作者: Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides
出版社: 机械工业出版社
出版年: 2000-9
原作名: Design Patterns: Elements of Reusable Object-Oriented Software
9
★★★★★
豆瓣评分 · 3,221 人评价
未标记阅读状态
GoF 四位大神总结的 23 个“前人踩坑换来的套路”:识别反复出现的问题,直接用被验证过的方案,不用重新发明轮子。

总体观点

1994 年,四位博士(人称 GoF)总结 23 种设计模式。在此之前,高手的“套路”只可意会不可言传;这本书起了名字、画了图、写成标准,全世界程序员有了共同的设计语言。

核心观点:很多问题反复出现,就有被验证过的优雅解法——这就是“模式”。模式不是代码,是“解决问题的思路模板”。最大好处不只是写代码,更是沟通:说“这里用观察者模式”,同事立刻懂。

它开创了一个领域:面试必问的单例、工厂、观察者、策略全从这里出来。三十年语言换几代,模式还在用——因为它们针对的是“变化”本身。但作者也提醒:别为用模式而用模式。

核心观点

  1. 1. 针对接口编程,不针对实现编程

    代码依赖“抽象”(接口长什么样),不依赖“具体”(它到底是谁)。接口是契约,实现是干活的人——换人不用换契约,具体实现随便换,调用方不用改。

    代码里到处直接创建 MySQL 存储对象,换 MongoDB 得改几十处。依赖统一存储接口,换时只写个新实现类,调用方一行不动。
  2. 2. 优先用组合,而不是继承

    新手最爱用继承:“狗继承动物,警犬继承狗”,结果改爷爷类孙子类全受影响。能用“组合”(对象里装着另一个对象)解决的别用继承——组合更灵活,想换就换,不用动祖宗。

    鸭子游戏:绿头鸭继承鸭子,后来加“橡皮鸭”不会飞,继承来的飞行方法成 bug。改成组合:想飞装会飞的行为,不想飞装不会飞的,随时换。
  3. 3. 模式是套路,不是银弹

    模式是“特定场景下被验证过的解法”,不是“用了就高级”的勋章。最简单的方案往往最好,为炫技硬套模式只会把代码搞复杂。判断标准:不套模式,这段代码是不是真难受?

    全项目只有一个地方创建对象,非要上“抽象工厂模式”,三层类套下来别人得翻五个文件。直接创建一个对象就行——模式是止痛药不是维生素,没病别乱吃。
  4. 4. 23种模式分三类

    23 种模式按用途分三类:创建型(5 种,管“对象怎么生出来”)、结构型(7 种,管“怎么组装”)、行为型(11 种,管“怎么协作”)。找模式先想:卡在创建、组装,还是协作上,一下缩小范围。

    “根据配置创建不同支付方式”是创建问题→工厂方法;“好多对象要互相通知”是协作问题→观察者。
  5. 5. 观察者模式:一对多广播

    一对多依赖:一个对象状态变了,所有依赖它的自动收到通知。像公众号:你关注了号主,一发文所有粉丝自动收到推送,不用轮询“更新了吗”。

    股票 App:股价一变,所有打开这只股票页面的手机都要刷新。股价对象只管广播“我变了”,加 100 个新页面,股价对象一行不用改。
  6. 6. 策略模式:算法随便换

    把一堆“二选一、多选一”的算法封装成独立的类,互相替换。调用方只管“我要算”,不管“怎么算”。加新算法,加个类就行,不碰老代码。

    商城打折:普通 95 折、VIP 85 折、员工 7 折。不用策略就是一堆 if-else,加一种用户就得改核心代码。用策略,加“合作伙伴 8 折”新建一个类,老代码不动。
  7. 7. 工厂模式:把创建对象的事藏起来

    创建对象别让调用方直接动手,交给“工厂”管。调用方只说“我要个日志记录器”,工厂决定给控制台版还是文件版。“怎么创建”和“怎么使用”解耦,换实现不影响调用方。

    日志系统:开发环境打控制台,生产环境写文件。调用方找工厂要记录器,从开发切生产改个配置就行,业务代码一个字不动。
树状思维导图

全书思维导图 · 知识脉络树

💡 拖拽平移 · 滚轮缩放 · 点击分支圆点折叠/展开
已复制思维导图大纲到剪贴板!

全书结构

  1. 第1章 引言

    确立设计模式核心定义(名称、问题、解决方案、效果),确立“针对接口编程”与“优先使用组合而非继承”两大面向对象设计基石。

    不直接将业务逻辑绑定在某个具体的 MySQL 连接类上,而是面向通用的 DatabaseConnection 接口编程,切换数据库无需改动上层业务。
  2. 第2章 实例研究:设计一个文档编辑器

    以文档编辑器 Lexi 为例,贯穿运用组合模式组织文档树、策略模式排版文本、装饰模式添加边框以及命令模式支持撤销重做。

    文字、图片和行容器统一实现 Glyph 接口(组合模式),排版算法单独抽象为 Compositor 策略,新增两端对齐算法完全无需触动文档结构。
  3. 第3章 创建型模式

    抽象工厂、工厂方法、单例、建造者与原型模式,将对象的实例化过程与客户端解耦,控制对象创建的灵活性。

    使用建造者模式(Builder)按步骤逐步装配包含几十个复杂网络配置项的 HttpClient,避免使用冗长且容易传错位置的重载构造函数。
  4. 第4章 结构型模式

    适配器、桥接、组合、装饰、外观、享元与代理模式,灵活组合类和对象以构建更大规模且低耦合的软件结构。

    使用适配器模式(Adapter)将旧系统的 XML 消息接口转换为新系统的 JSON 接口,老服务无需推倒重来即可接入全新中台。
  5. 第5章 行为模式

    职责链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法与访问者模式,分配职责与协调对象通信。

    利用状态模式(State)管理订单状态流转(待付款、已发货、已完成),每个状态封装自身的合法流转行为,消除庞大脆弱的 switch-case。
  6. 第6章 结论

    总结面向对象设计模式的认知图谱,警惕把模式当教条强行套用,拥抱简约原则,在演化中识别设计模式的真正时机。

    开发初期采用最简单清晰的直接实现,当业务发展出现多处变化与扩展痛点时,再针对性引入策略或工厂模式重构。
返回 软件工程 目录

观点与结构均为转述总结,非原文摘录。封面图片来自豆瓣读书,仅作展示。

豆瓣评分与评价人数为逐本人工核实当天的数值。 · GitHub 仓库 · v1.0.0