出版者的话
译者序
前言
第1章 绪论1
1.1 定义软件设计3
1.2 软件开发过程中的设计5
1.3 获取设计知识6
1.4 共享设计技术8
1.4.1 设计模式8
1.4.2 设计反模式10
小结10
延伸阅读11
第2章 封装12
2.1 封装与信息隐藏12
2.2 将抽象编码为类型13
2.3 作用域与可见性限制16
2.4 对象图18
2.5 逃逸引用20
2.5.1 返回指向内部对象的引用21
2.5.2 在内部存储外部引用22
2.5.3 通过共享结构泄露引用22
2.6 不可变性23
2.7 提供内部数据25
2.7.1 扩展接口25
2.7.2 返回副本26
2.7.3 高级机制27
2.8 契约式设计27
小结30
代码探索30
延伸阅读32
第3章 类型与接口33
3.1 行为与实现解耦合33
3.2 指定接口的行为36
3.3 类图38
3.4 函数对象40
3.5 迭代器43
3.6 ITERATOR设计模式45
3.7 STRATEGY设计模式46
3.8 接口分离原则47
小结50
代码探索50
延伸阅读52
第4章 对象状态53
4.1 软件系统的静态和动态视图53
4.2 定义对象状态54
4.3 状态图55
4.4 设计对象生命周期57
4.4.1 无效和无用的状态58
4.4.2 不必要的状态信息58
4.5 可空性59
4.5.1 无须对不存在的值建模60
4.5.2 对不存在的值建模61
4.5.3 可选值类型62
4.5.4 NULL OBJECT设计模式63
4.6 终极域和变量64
4.7 对象身份、相等和唯一66
4.8 FLYWEIGHT设计模式68
4.9 SINGLETON设计模式71
4.10 嵌套类的对象72
4.10.1 内部类72
4.10.2 匿名类74
小结75
代码探索76
延伸阅读77
第5章 单元测试78
5.1 单元测试简介78
5.2 JUnit单元测试框架基础81
5.3 测试代码的组织82
5.4 元程序设计83
5.4.1 内省84
5.4.2 程序的操作86
5.4.3 程序元数据87
5.5 测试构建88
5.6 测试和异常条件91
5.7 封装与单元测试93
5.8 桩测试95
5.9 测试覆盖96
5.9.1 语句覆盖98
5.9.2 分支覆盖98
5.9.3 路径覆盖99
小结99
代码探索100
延伸阅读101
第6章 复合102
6.1 复合与聚合102
6.2 COMPOSITE设计模式105
6.3 时序图109
6.4 DECORATOR设计模式112
6.5 COMPOSITE与DECORATOR的结合116
6.6 多态对象复制118
6.6.1 声明实现Cloneable接口119
6.6.2 重写Object.clone()方法120
6.6.3 调用super.clone()120
6.6.4 捕获CloneNotSupported-Exception121
6.6.5 把clone()加入接口122
6.7 PROTOTYPE设计模式123
6.8 COMMAND设计模式124
6.9 迪米特法则127
小结128
代码探索129
延伸阅读131
第7章 继承132
7.1 继承的实例132
7.2 继承和子类134
7.2.1 向下类型转换135
7.2.2 单根的类层次结构136
7.3 继承域137
7.4 继承方法139
注解重写方法143
7.5 重载方法143
7.6 继承与复合145
7.7 抽象类147
7.8 重温DECORATOR设计模式149
7.9 TEMPLATE METHOD设计模式 151
7.9.1 终极方法与终极类152
7.9.2 抽象方法153
7.9.3 模式总结154
7.10 正确使用继承155
7.10.1 限制基类客户端的行为155
7.10.2 不适合作子类型的子类158
小结159
代码探索159
延伸阅读161
第8章 控制流反转162
8.1 使用控制流反转的动机162
8.2 模型–视图–控制器分解164
8.3 OBSERVER设计模式165
8.3.1 模型和观察者的连接165
8.3.2 模型和观察者间的控制流166
8.3.3 模型和观察者间的数据流168
8.3.4 事件驱动程序设计170
8.3.5 小结172
8.4 应用OBSERVER设计模式173
8.5 图形用户界面开发导论177
8.6 图形用户界面组件图178
8.6.1 用户体验视角178
8.6.2 逻辑视角179
8.6.3 源代码视角179
8.6.4 运行时视角181
8.6.5 定义对象图181
8.7 事件处理183
8.8 VISITOR设计模式186
8.8.1 具体和抽象访问者188
8.8.2 在类层次结构中集成操作189
8.8.3 遍历对象图191
8.8.4 OBSERVER模式中使用继承194
8.8.5 在访问者结构中支持数据流196
小结197
代码探索198
延伸阅读200
第9章 函数式设计201
9.1 一等函数201
9.2 函数式接口、lambda表达式和方法引用203
9.2.1 函数式接口203
9.2.2 lambda表达式204
9.2.3 方法引用207
9.3 使用函数复合行为208
9.4 用函数作数据供给者212
供给者函数与OBSERVER模式217
9.5 一等函数和设计模式218
9.5.1 函数式STRATEGY218
9.5.2 函数式COMMAND220
9.6 函数式数据处理221
9.6.1 数据作为流222
9.6.2 将高阶函数应用于流223
9.6.3 过滤流224
9.6.4 映射数据元素225
9.6.5 规约流226
小结228
代码探索228
延伸阅读230
附录A Java程序设计语言的重要概念231
附录B 代码规范237
附录C 应用实例240
参考文献242