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

总体观点
1994 年,四位博士(人称 GoF)总结 23 种设计模式。在此之前,高手的“套路”只可意会不可言传;这本书起了名字、画了图、写成标准,全世界程序员有了共同的设计语言。
核心观点:很多问题反复出现,就有被验证过的优雅解法——这就是“模式”。模式不是代码,是“解决问题的思路模板”。最大好处不只是写代码,更是沟通:说“这里用观察者模式”,同事立刻懂。
它开创了一个领域:面试必问的单例、工厂、观察者、策略全从这里出来。三十年语言换几代,模式还在用——因为它们针对的是“变化”本身。但作者也提醒:别为用模式而用模式。
核心观点
-
1. 针对接口编程,不针对实现编程
代码依赖“抽象”(接口长什么样),不依赖“具体”(它到底是谁)。接口是契约,实现是干活的人——换人不用换契约,具体实现随便换,调用方不用改。
代码里到处直接创建 MySQL 存储对象,换 MongoDB 得改几十处。依赖统一存储接口,换时只写个新实现类,调用方一行不动。 -
2. 优先用组合,而不是继承
新手最爱用继承:“狗继承动物,警犬继承狗”,结果改爷爷类孙子类全受影响。能用“组合”(对象里装着另一个对象)解决的别用继承——组合更灵活,想换就换,不用动祖宗。
鸭子游戏:绿头鸭继承鸭子,后来加“橡皮鸭”不会飞,继承来的飞行方法成 bug。改成组合:想飞装会飞的行为,不想飞装不会飞的,随时换。 -
3. 模式是套路,不是银弹
模式是“特定场景下被验证过的解法”,不是“用了就高级”的勋章。最简单的方案往往最好,为炫技硬套模式只会把代码搞复杂。判断标准:不套模式,这段代码是不是真难受?
全项目只有一个地方创建对象,非要上“抽象工厂模式”,三层类套下来别人得翻五个文件。直接创建一个对象就行——模式是止痛药不是维生素,没病别乱吃。 -
4. 23种模式分三类
23 种模式按用途分三类:创建型(5 种,管“对象怎么生出来”)、结构型(7 种,管“怎么组装”)、行为型(11 种,管“怎么协作”)。找模式先想:卡在创建、组装,还是协作上,一下缩小范围。
“根据配置创建不同支付方式”是创建问题→工厂方法;“好多对象要互相通知”是协作问题→观察者。 -
5. 观察者模式:一对多广播
一对多依赖:一个对象状态变了,所有依赖它的自动收到通知。像公众号:你关注了号主,一发文所有粉丝自动收到推送,不用轮询“更新了吗”。
股票 App:股价一变,所有打开这只股票页面的手机都要刷新。股价对象只管广播“我变了”,加 100 个新页面,股价对象一行不用改。 -
6. 策略模式:算法随便换
把一堆“二选一、多选一”的算法封装成独立的类,互相替换。调用方只管“我要算”,不管“怎么算”。加新算法,加个类就行,不碰老代码。
商城打折:普通 95 折、VIP 85 折、员工 7 折。不用策略就是一堆 if-else,加一种用户就得改核心代码。用策略,加“合作伙伴 8 折”新建一个类,老代码不动。 -
7. 工厂模式:把创建对象的事藏起来
创建对象别让调用方直接动手,交给“工厂”管。调用方只说“我要个日志记录器”,工厂决定给控制台版还是文件版。“怎么创建”和“怎么使用”解耦,换实现不影响调用方。
日志系统:开发环境打控制台,生产环境写文件。调用方找工厂要记录器,从开发切生产改个配置就行,业务代码一个字不动。
全书思维导图 · 知识脉络树
全书结构
-
第1章 引言
确立设计模式核心定义(名称、问题、解决方案、效果),确立“针对接口编程”与“优先使用组合而非继承”两大面向对象设计基石。
不直接将业务逻辑绑定在某个具体的 MySQL 连接类上,而是面向通用的 DatabaseConnection 接口编程,切换数据库无需改动上层业务。 -
第2章 实例研究:设计一个文档编辑器
以文档编辑器 Lexi 为例,贯穿运用组合模式组织文档树、策略模式排版文本、装饰模式添加边框以及命令模式支持撤销重做。
文字、图片和行容器统一实现 Glyph 接口(组合模式),排版算法单独抽象为 Compositor 策略,新增两端对齐算法完全无需触动文档结构。 -
第3章 创建型模式
抽象工厂、工厂方法、单例、建造者与原型模式,将对象的实例化过程与客户端解耦,控制对象创建的灵活性。
使用建造者模式(Builder)按步骤逐步装配包含几十个复杂网络配置项的 HttpClient,避免使用冗长且容易传错位置的重载构造函数。 -
第4章 结构型模式
适配器、桥接、组合、装饰、外观、享元与代理模式,灵活组合类和对象以构建更大规模且低耦合的软件结构。
使用适配器模式(Adapter)将旧系统的 XML 消息接口转换为新系统的 JSON 接口,老服务无需推倒重来即可接入全新中台。 -
第5章 行为模式
职责链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法与访问者模式,分配职责与协调对象通信。
利用状态模式(State)管理订单状态流转(待付款、已发货、已完成),每个状态封装自身的合法流转行为,消除庞大脆弱的 switch-case。 -
第6章 结论
总结面向对象设计模式的认知图谱,警惕把模式当教条强行套用,拥抱简约原则,在演化中识别设计模式的真正时机。
开发初期采用最简单清晰的直接实现,当业务发展出现多处变化与扩展痛点时,再针对性引入策略或工厂模式重构。