第一篇 预备知识——发掘Java语言的面向对象设计潜力 1
第1章 面向对象设计原则 2
1.1 说明 3
1.2 单一职责原则(SRP) 4
1.3 里氏替换原则(LSP)和依赖倒置原则(DIP) 6
1.4 接口隔离原则(ISP) 7
1.5 迪米特法则(Law of Demeter,LoD) 9
1.6 开闭原则(OCP) 10
1.7 小结 13
1.8 自我检验 14
第2章 重新研读Java语言 15
2.1 说明 16
2.2 Java部分语法内容扩展 16
2.2.1 规划和组织代码——包 16
2.2.2 正式命名的常量契约——枚举 19
2.2.3 考验算法的抽象能力——泛型 20
2.2.4 用贴标签的方式扩展对象特性——标注 26
2.3 面向插件架构的配置系统设计 30
2.4 依赖注入 33
2.4.1 背景介绍 33
2.4.2 示例情景 34
2.4.3 构造注入(Constructor) 36
2.4.4 设值注入(Setter) 36
2.4.5 接口注入 37
2.4.6 小结 38
2.4.7 自我检验 39
2.5 连贯接口(Fluent Interface) 40
2.6 自我检验 41
第3章 Java和C 43
3.1 说明 44
3.2 枚举 44
3.3 泛型 48
3.4 属性和标注 50
3.5 操作符重载和类型转换重载 52
3.6 委托、事件、匿名方法 52
3.7 Lamada和LINQ 56
3.8 小结 61
第二篇 创建型模式——管理对象实例的构造过程 62
第4章 工厂及工厂方法模式 63
4.1 说明 64
4.2 简单工厂 64
4.2.1 最简单的工厂类 64
4.2.2 简单工厂的局限性 67
4.3 经典回顾 68
4.4 解耦工厂类型与客户程序 69
4.5 基于配置文件的工厂 73
4.5.1 基于配置文件解耦工厂接口和具体工厂类型 73
4.5.2 基于配置文件解耦工厂类型和具体工作产品 74
4.6 批量工厂 77
4.7 典型工程化实现 78
4.8 小结 80
4.9 Java中的典型实现 81
4.10 自我检验 81
第5章 单件模式 82
5.1 说明 83
5.2 经典回顾 84
5.3 枚举方式的单件模式 88
5.4 细节决定成败 89
5.5 线程级单件模式 92
5.6 分布式环境下的单件模式 94
5.7 单件模式的使用问题 96
5.8 小结 97
5.9 Java中的典型实现 97
第6章 抽象工厂模式 98
6.1 说明 99
6.2 经典回顾 100
6.3 解决经典模式的硬伤 102
6.4 委托生产外包 105
6.5 小结 109
6.6 Java中的典型实现 110
第7章 创建者模式 111
7.1 说明 112
7.2 经典回顾 113
7.3 为Builder贴个标签 116
7.4 具有装配/卸裁能力的Builder 117
7.5 连贯接口形式的Builder 118
7.6 小结 122
7.7 Java中的典型实现 122
7.8 自我检验 122
第8章 原型模式 123
8.1 说明 124
8.2 经典回顾 124
8.3 表面模仿还是深入模仿 129
8.3.1 概念 129
8.3.2 “纯手工”实现深层复制 130
8.3.3 制作实现序列化工具类型 133
8.3.4 简单自定义复制过程 135
8.3.5 细颗粒度自定义复制过程 135
8.4 小结 138
8.5 自我检验 138
第三篇 结构型模式——组织灵活的对象体系 140
第9章 适配器模式 141
9.1 说明 142
9.2 经典回顾 143
9.3 组适配器 146
9.4 用配置约定适配过程 149
9.5 面向数据的适配机制 151
9.6 小结 154
9.7 Java中的典型实现 154
9.8 自我检验 154
第10章 桥模式 157
10.1 说明 158
10.2 经典回顾 159
10.3 分解复杂性的多级桥关系 163
10.4 具有分支的桥 164
10.5 看着“图纸”造桥 168
10.6 具有约束关系的桥 171
10.7 小结 173
10.8 自我检验 173
第11章 组合模式 175
11.1 说明 176
11.2 经典回顾 177
11.3 适于XML信息的组合模式 183
11.4 分布式“部分—整体”环境 185
11.5 小结 185
11.6 Java中的典型实现 186
11.7 自我检验 186
第12章 装饰模式 187
12.1 说明 188
12.2 经典回顾 188
12.3 卸载装饰 194
12.4 通过配置和创建者完成装饰过程 194
12.5 Java中的典型实现 197
12.6 小结 198
第13章 外观模式 199
13.1 说明 200
13.2 经典回顾 200
13.3 平台、开发语言无关的抽象外观接口——WSDL 203
13.4 Java中的典型实现 204
13.5 小结 204
第14章 享元模式 205
14.1 说明 206
14.2 经典回顾 206
14.3 枚举享元方式 212
14.4 制订共享计划 214
14.5 通过“委托—代理”关系和队列实现异步享元 214
14.6 小结 214
第15章 代理模式 215
15.1 说明 216
15.2 经典回顾 216
15.3 远程代理 219
15.4 动态代理 220
15.5 Java中的典型实现 223
15.6 小结 224
第四篇 行为型模式——算法、控制流的对象化操作 225
第16章 职责链模式 226
16.1 说明 227
16.2 经典回顾 227
16.3 非链表方式定义职责链 232
16.4 小结 238
16.5 Java中的典型实现 239
第17章 模板方法模式 240
17.1 说明 241
17.2 经典回顾 242
17.3 类和接口的模板——泛型 247
17.4 系统架构的模板——配置 248
17.5 小结 248
17.6 Java中的典型实现 249
17.7 自我检验 249
第18章 解释器模式 250
18.1 说明 251
18.2 经典回顾 252
18.3 采用正则表达式 256
18.4 采用字典 261
18.5 多级解释器系统 266
18.6 用XSD解释自定义业务语言 267
18.7 小结 268
18.8 Java中的典型实现 269
18.9 自我检验 269
第19章 命令模式 270
19.1 说明 271
19.2 经典回顾 272
19.3 打包命令对象 275
19.4 异步命令操作 281
19.5 命令操作队列 284
19.6 小结 284
19.7 Java中的典型实现 285
19.8 自我检验 285
第20章 迭代器模式 286
20.1 说明 287
20.2 经典回顾 288
20.3 Java内置的迭代器 289
20.4 小结 292
20.5 自我检验 292
第21章 中介者模式 293
21.1 说明 294
21.2 经典回顾 295
21.3 根据配置动态协调通知关系 300
21.4 小结 303
21.5 Java中的典型实现 303
21.6 自我检验 304
第22章 备忘录模式 305
22.1 说明 306
22.2 经典回顾 307
22.3 把备忘压栈 312
22.4 备忘录的序列化和持久化 314
22.5 小结 318
22.6 Java中的典型实现 319
22.7 自我检验 319
第23章 观察者模式 320
23.1 说明 321
23.2 经典回顾 324
23.3 面向服务接口的观察者 328
23.4 小结 330
23.5 Java中的典型实现 330
23.6 自我检验 331
第24章 状态模式 332
24.1 说明 333
24.2 经典回顾 334
24.3 状态的序列化和持久化 339
24.4 主动状态对象 341
24.5 小结 342
24.6 自我检验 342
第25章 策略模式 343
25.1 说明 344
25.2 经典回顾 345
25.3 策略模式与解释器模式的协作 347
25.4 Java中的典型实现 348
25.5 小结 348
第26章 访问者模式 349
26.1 说明 350
26.2 经典回顾 350
26.3 借助反射或Dynamic实现访问者 355
26.4 Java中的典型实现 358
26.5 小结 358
26.6 自我检验 359
第五篇 GOF综合练习 360
第27章 GOF部分阶段实践 361
27.1 回顾GOF 362
27.2 需求的提出 363
27.3 第一轮技术分析 364
27.4 第二轮技术分析 365
27.5 第三轮技术分析 367
27.6 示例实现 368
附录A Java和C#关键字对照表 394