《图解设计模式》中各章节的划分与 GoF 的分类不同,详情如下:
- 第1部分“适应设计模式”,比较容易理解的设计模式
Iterator(迭代器)模式
Adapter(适配器)模式 - 第2部分“交给子类”,与类继承相关的设计模式
Template Method(模板方法)模式
Factory Method(工程方法)模式 - 第3部分“生成实例”,与生成实例相关的设计模式
Singleton(单例)模式
Prototype(原型)模式
Builder(建造者)模式
Abstract Factory(抽象工厂)模式 - 第4部分“分开考虑”,分开考虑易变得杂乱无章的处理的设计模式
Bridge(桥梁)模式
Strategy(策略)模式 - 第5部分“一致性”,能够让两个看上去不同的对象的操作变得统一,以及在不改变处理方法的前提下增加功能的设计模式,包含委托
Composite(组合)模式
Decorator(装饰器)模式 - 第6部分“访问数据结构”,漫步数据结构的设计模式
Visitor(访问者)模式
Chain of Responsibility(责任链)模式 - 第7部分“简单化”,让类关系简单的设计模式
Facade(外观)模式
Mediator(中介者)模式 - 第8部分“管理状态”,与状态相关的设计模式
Observer(观察者)模式
Memento(备忘录)模式
State(状态)模式 - 第9部分“避免浪费”,可以避免浪费、提高处理效率的设计模式
Flyweight(享元)模式
Proxy(代理)模式 - 第10部分“用类来表现”,用类来表现特殊东西的设计模式
Command(命令)模式
Interpreter(解释器)模式
学习设计模式之前
1. 设计模式并非类库
与类库相比,设计模式是一个更为普遍的概念。类库是由程序组合而成的组件,而设计模式则用来表现内部组件是如何被组装的,以及每一个组件是如何通过相互关联来构成一个庞大系统的。
重要的是在这段代码中有哪些类和接口,它们之间是什么样的关系。
2. 但是类库中使用了设计模式
设计模式并非类库,但 Java 标准库中使用了许多设计模式。掌握了设计模式可以帮助我们理解这些类库所扮演的角色。
3. 示例程序并非成品
设计模式的目标之一就是提高程序的可复用性;也就是说,设计模式考虑的是怎样才能将程序作为“组件”重复使用。因此,不应当将示例程序看作是成品,而应当将其作为扩展和变更的基础。
- 有哪些功能可以扩展
- 扩展功能时必须修改哪些地方
- 有哪些类不需要修改
从以上角度看待设计模式可以帮助我们加深对设计模式的理解。
4. 不只是看图,还要理解图
本书以图解的方式讲解设计模式,其中主要使用的有类图和时序图。这些图并非只是简单的画,只瞥一眼是无法理解其中内容的。
看类图时,首先看长方形(类),然后看它们里面的方法,并确认哪些是普通方法、哪些是抽象方法。接着确认类之间的箭头的指向,弄清究竟是哪个类实现了哪个接口。只有像这样循序渐进,一步一步对图中的内容刨根问底才能真正理解这幅图的主旨。
相比于类图,时序图可以按照实际顺序自上而下一步一步确认哪个对象调用了哪个对象,就可以慢慢理解每个对象在模式中所扮演的角色。
5. 理解角色
在每种设计模式中,类和接口被安排扮演各自的角色 。各个类和接口如果不能理解自己所扮演的角色,就无法深入理解电影整体的剧情,无法扮演好自己的角色。在阅读示例代码时,不要只盯着代码本身,而要将关注点转移到角色身上来,在阅读代码的时候,要思考各个类和接口到底在模式中扮演着什么角色。