《《设计模式》(Erich Gamma 等)— 面向对象设计》阅读笔记

《《设计模式》(Erich Gamma 等)— 面向对象设计》阅读笔记

自动生成 | 2026-06-09 10:53 | 🌐 web兜底

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


一、作者与背景

本书由四位计算机科学家联合撰写,他们被业界尊称为“四人组”(Gang of Four,简称GoF)。Erich Gamma现任Eclipse项目架构师;Richard Helm曾任职于IBM;Ralph Johnson是伊利诺伊大学香槟分校教授;John Vlissides亦为IBM研究员。该书于1994年首次出版,正值面向对象编程方兴未艾之际,作者们基于多年软件开发实践与学术研究,系统总结了软件开发领域中久经考验的设计经验。

此书之诞生,恰逢软件工程从结构化编程向面向对象编程范式转型的历史节点。彼时,程序员虽已开始采用面向对象技术,却缺乏可复用的设计智慧作为指引。四人组以建筑师 Christopher Alexander 的建筑模式语言为蓝本,将软件设计中反复出现的问题与解决方案加以归纳提炼,开创了软件工程领域系统化研究设计模式之先河。


二、核心内容

本书以“设计模式”为核心概念,系统阐述了在面向对象软件设计中如何运用成熟的设计经验来解决常见问题。全书将23种设计模式分为三大类别:创建型模式关注对象的创建机制,包括工厂方法、抽象工厂、建造者、原型、单例五种模式;结构型模式处理对象间的组合关系,涵盖适配器、桥接、组合、装饰、外观、享元、代理七种模式;行为型模式则关注对象间的职责分配与算法封装,包含责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者十一种模式。

本书不仅提供模式目录,更着重阐述面向对象设计的核心原则:针对接口编程而非针对实现编程;优先使用对象组合而非类继承;识别并封装变化的因素。书中以C++与Smalltalk代码示例详尽展示每种模式的结构、参与者和协作方式,并配以丰富的应用场景说明与优缺点分析,使读者能够在具体项目中识别模式应用的时机与方式。


三、精华摘录

“设计模式是一种记载了设计经验的文档,它描述了一个在特定场景下反复发生的问题,以及该问题的解决方案的核心要点。”

“针对接口编程,而不是针对实现编程。”

“优先使用对象组合,而不是类继承。”

“封装变化的原则:找出应用中可能变化之处,将其独立出来,不要和那些不需要变化的代码混在一起。”

“一个设计模式不仅仅是一段可复用的代码,更重要的是,它描述了一种可复用的设计思想。”

“设计模式帮助开发者站在巨人的肩膀上,将经过时间检验的设计经验为我所用。”

“模式的真正价值在于它提供了一种共同的设计词汇,使得开发团队成员之间能够高效沟通。”

“没有一种设计模式是万能的,理解模式的意图比记忆其实现细节更为重要。”

“设计模式的核心在于’设计’而非’模式’——模式的生命力源于其背后的设计原则与灵活性。”

“将设计模式视为一种语言,一种描述软件结构的语言,它的语法是结构,语义是意图。”


四、主题分析

主题一:变化与封装的哲学

本书最深刻的思想内核在于“封装变化”这一原则。四位作者敏锐地洞察到,软件系统之所以难以维护、难以扩展,根本原因在于变化的存在——需求会变化、业务会变化、技术会变化。而设计模式的核心智慧,正是教会我们如何将“变化”从稳定的核心逻辑中剥离出来,独立封装,独立应对。

这一思想与中国古典哲学中“变与不变”的辩证关系遥相呼应。《周易》所谓“穷则变,变则通,通则久”,正是在承认变化必然性的前提下,寻求应对变化的智慧。设计模式所展现的,正是这种在承认变化永恒性的同时追求系统稳定的实践理性。工厂方法模式将对象的创建过程封装以应对类型变化;策略模式将算法家族封装以应对行为变化;观察者模式将一对多依赖关系封装以应对通知逻辑变化——每一种模式都是对某一类变化的优雅回应。

主题二:复用思想的三重境界

本书揭示了软件复用思想的三个层次:代码复用设计复用思想复用。代码复用关注的是具体实现片段的重用;设计复用关注的是抽象结构与关系的重用;而思想复用则关注的是解决问题的方法论的重用。设计模式居于设计与思想之间,它既是具体可操作的设计方案,又是抽象概括的设计智慧。

这种三重境界的划分,对于软件工程实践具有重要的方法论启示。初级程序员追求代码复用,中级工程师追求设计复用,而真正的软件架构师则追求思想复用——能够从具体模式中抽离出原则,再将原则灵活运用于前所未有的新场景。正如庄子所言“得意忘言”,真正的模式运用者应当能够超越模式的字面形态,把握其精神实质,灵活应变而非生搬硬套。


五、个人感悟

阅读本书,不禁感慨于知识传承的艰难与可贵。四位作者将自己数十年积累的设计经验凝练为23种模式,这不仅是对技术的贡献,更是对整个软件行业知识沉淀机制的创造性贡献。在软件行业,新人往往需要经历漫长的试错才能领悟的设计原则,通过本书可以在数日内获得,这种知识传递效率的提升本身就是软件工程进步的体现。

然而,本书亦警示我们:模式既是利器,亦可能是枷锁。书中提到的“过度工程”与“模式滥用”现象,在当今软件开发实践中依然屡见不鲜。年轻程序员初学设计模式后,往往急于在每一个场景中套用模式,反而将简单的代码复杂化。真正的设计智慧不在于使用多少模式,而在于在最恰当的时机选择最恰当的方案——有时最简单直接的实现,反而是最优雅的设计。

同时,本书也让人深刻认识到“设计感”的培养需要长期积累。模式本身是死的,但将其灵活运用于具体问题的过程是活的。这种判断能力的培养,需要大量的实践、反思与总结,绝非阅读一两本著作所能替代。


六、方法论联系

本书所阐述的设计模式思想,与中国传统哲学中的“道术之辨”有着深刻的内在联系。老子云:“有道无术,术尚可求也;有术无道,止于术矣。”设计模式作为“术”,若脱离面向对象设计原则这一“道”的指导,便沦为机械的套路;唯有将模式置于设计原则的宏观框架下理解,才能真正发挥其价值。

在儒学传统中,孔子倡导“君子不器”,强调人的发展不应局限于某一具体技能,而应追求更高远的德行修养。软件设计亦然——一个优秀的架构师不应满足于掌握若干种设计模式,而应追求对面向对象设计原则的深刻领悟,达到“手中无模式,心中有模式”的境界。模式是手段而非目的,是工具而非终点。

从科学方法论的角度审视,本书体现了归纳法与演绎法的辩证统一。四位作者通过对大量已有软件系统的归纳分析,提取出共同的设计模式;再以这些模式为出发点,指导新系统的设计——这是从特殊到一般、再从一般到特殊的认识论循环。设计模式的验证,不是通过形式化证明,而是通过实践中的反复成功来确立其有效性,这正体现了科学哲学中“观察-假说-验证”的基本范式。


七、后续计划

基于本书的学习,后续将从以下四个维度深化对设计模式的理解与运用:

其一,实践验证。 选择一个中型项目,在开发过程中主动识别可应用设计模式的场景,并在代码实现中刻意运用至少五种以上不同的设计模式,记录每种模式的应用时机、决策过程与实际效果。

其二,对比分析。 深入研究每种模式与其“变体”或“替代方案”之间的区别,例如比较工厂方法与抽象工厂的适用场景差异,比较装饰器模式与继承方案的优劣对比,形成对模式选择决策的系统化认知。

其三,跨语言探索。 在掌握本书C++示例的基础上,尝试用Python、JavaScript等不同编程语言实现同一模式,观察语言特性对模式实现方式的影响,深化对模式本质的理解。

其四,模式演进。 关注设计模式在新编程范式(如函数式编程、响应式编程)下的演变与新生,探索在现代软件开发中如何创造性地运用传统设计思想,为“后GoF时代”的设计模式研究奠定基础。


读书笔记完