设计模式
《设计模式》由GoF四人帮撰写,是面向对象设计领域的奠基性著作。书中总结了23种经典设计模式,按创建型、结构型和行为型分为三大类。本书深刻影响了软件工程的发展。
本书速读
《设计模式:可复用面向对象软件的基础》由Gang of Four(GoF)四人组——Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides共同撰写。这本书是软件工程领域的里程碑式著作,奠定了面向对象设计模式理论的基础。
书中系统总结了23种经典设计模式,按照创建型、结构型和行为型三大类别进行分类。每种模式都包含了模式名称、意图、动机、结构、参与者、协作、效果、实现和已知应用等完整的描述框架。
设计模式的核心思想是:在特定上下文中反复出现的问题,已经有经过验证的解决方案。学习和运用这些模式,可以帮助开发者避免重复造轮子,用已被证明有效的方式解决常见的设计问题。
本书不仅是一本模式手册,更是一种设计思维的训练。它教会读者如何识别问题场景、选择合适的模式、权衡不同方案的利弊,最终做出合理的设计决策。
虽然书中的示例代码以C++和Smalltalk编写,但所有模式的思想都可以迁移到任何面向对象语言中。Java、C#、Python等现代语言的框架和库中,到处都能看到这些模式的影子。
掌握设计模式不是要死记硬背23种模式的结构,而是要理解背后的设计原则:面向接口编程、优先使用对象组合而非继承、找出变化点并封装它。这些原则才是模式真正的灵魂。
模块1:基础——在深入具体模式之前,理解底层的设计原则至关重要。
接口编程:针对接口而非实现编程,让系统各模块之间通过抽象契约交互,降低耦合度,提高可扩展性和可测试性。 对象组合:优先使用对象组合而非类继承来获得运行时行为变化,组合比继承更灵活,可以在运行时动态替换行为。 封装变化点:识别系统中经常变化的部分,将其封装在独立的模块中,让稳定部分不受变化的影响,这是所有设计模式的共同出发点。 开闭原则:好的设计应该对扩展开放、对修改封闭,新功能通过扩展现有结构实现,而不是修改已有的稳定代码。理解这些基础原则,才能真正灵活运用设计模式,而非生搬硬套。
模块2:创建型模式——关注对象的创建过程,将对象的实例化与使用分离。
抽象工厂:提供一个创建一系列相关对象的接口,无需指定具体类,适合需要支持多种产品族的系统。 单例模式:确保一个类只有一个实例并提供全局访问点,适用于配置管理器、线程池等需要全局唯一实例的场景。 工厂方法:定义创建对象的接口但让子类决定实例化哪个类,将实例化延迟到子类,增加灵活性。 建造者模式:将复杂对象的构建过程与表示分离,同样的构建过程可以创建不同的表示,适合构造步骤多且可选参数多的对象。创建型模式让我们用灵活可控的方式创建对象,而不是到处使用new。
模块3:结构型模式——关注如何组合类和对象形成更大的结构。
适配器模式:将一个类的接口转换成客户期望的另一个接口,使原本不兼容的类可以协同工作,是系统集成的利器。 装饰器模式:动态地给对象添加额外职责,比继承更灵活,可以在运行时组合多个装饰器,实现功能的自由拼装。 代理模式:为其他对象提供一个代理以控制对这个对象的访问,可用于延迟加载、权限控制、远程调用等场景。 外观模式:为子系统提供一个统一的高层接口,隐藏内部复杂性,让客户端与子系统的交互更加简单直观。结构型模式解决的是"如何优雅地组织对象"的问题。
模块4:行为型模式——关注对象之间的通信和职责分配。
观察者模式:定义一对多的依赖关系,当主题对象状态改变时自动通知所有观察者,是事件驱动架构的核心模式。 策略模式:定义一系列可互换的算法族,让算法可以独立于使用它的客户端变化,用组合替代条件分支。 迭代器模式:提供一种顺序访问聚合对象元素的方法,而不暴露其内部表示,让遍历逻辑与数据结构解耦。 命令模式:将请求封装为对象,使你可以用不同的请求参数化其他对象,支持队列、日志和撤销操作。行为型模式让对象间的协作更加灵活、松耦合、易扩展。
💡 金句摘录:
1. "找到变化之处,把它隔离出来,这就是设计的核心。"
2. "面向接口编程,而非面向实现编程。"
3. "优先使用对象组合,而非类继承。"
4. "设计模式是前人踩过的坑铺成的路。"
📖 阅读建议:
不要试图一口气读完所有模式。建议先从你最熟悉的几个模式入手,在项目中找到可以应用的场景,实际运用后再逐步扩展。阅读时可以对照自己常用框架的源码,比如Spring中的工厂模式和代理模式,JDK中的观察者模式和迭代器模式。理解模式的关键不在于记忆结构图,而在于培养识别问题模式的能力——当你看到一段代码时,能本能地意识到"这里适合用某个模式来重构"。