第0章 漫谈UML 1
UML 2
类图 2
类和层次的关系 2
接口与实现 3
聚合 4
存取控制 5
类间的关联性 5
顺序图 6
处理流程和对象间的协调 6
开始学习Design Patterns之前 7
Design Patterns不等于类函数库 7
不要认为程序范例已经是完成品 8
不过,类函数库中确实用到Design Patterns 8
图不能只是看,要仔细解读 9
自己仔细琢磨范例 9
了解角色功能——白雪公主给谁演 9
第1部分 先熟悉设计Pattern 11
第1章 Iterator——迭代器 11
Iterator Pattern 12
程序示例 12
Aggregate接口 13
Iterator接口 14
Book类 15
BookShelf类 15
BookShelfIterator类 16
Main类 17
Iterator Pattern的所有参与者 18
无论实现结果如何,都能使用Iterator 19
扩展自我视野的提示 19
抽象类、接口实在很难搞 20
Aggregate与Iterator的对应 20
“下一个”容易搞错 21
“最后一个”也容易错 21
一个以上的Iterator 21
各种iterator 21
不需要deleteIterator 21
相关Pattern 22
重点回顾 22
练习题 22
第2章 Adapter(适配器)——换个包装再度利用 23
程序示例(1)(继承) 24
Adapter Pattern 24
Banner类 25
Print接口 26
PrintBanner类 26
Main类 27
程序示例(2)(委托) 27
Print类 28
PrintBanner类 29
Adapter Pattern的所有参与者 29
扩展自我视野的提示 30
什么时候用 30
就算没有源程序也无妨 31
版本更新与兼容性 31
重点回顾 32
相关Pattern 32
类差别太大 32
练习题 33
第2部分 万事交给子类 35
第3章 Template Method(模板方法)——实际处理就交给子类 35
Template Method Pattern 36
何谓模板(Template) 36
Template Method Pattern是什么 36
程序示例 37
AbstractDisplay类 38
CharDisplay类 38
StringDisplay类 39
Main类 41
逻辑可共享 42
扩展自我视野的提示 42
Template Method Pattern的所有参与者 42
父类跟子类的连续性 43
子类应视同父类 43
相关Pattern 43
进阶说明:类层次与抽象类 44
父类对子类的要求 44
抽象类的意义 44
父类跟子类之间的协调 44
重点回顾 45
练习题 45
第4章 Factory Method(工厂方法)——建立对象实例交给子类 47
Factory Method Pattern 48
程序示例 48
Factory类 49
Product类 49
IDCard类 50
IDCardFactory类 51
Main类 51
Factory Method Pattern的所有参与者 52
扩展自我视野的提示 53
框架与内容 53
产生对象实例——方法的实现方式 54
Pattern利用与程序开发工程师之间的沟通 55
相关Pattern 55
重点回顾 56
练习题 56
第3部分 建立对象实例 57
第5章 Singleton(单件)——惟一的对象实例 57
程序示例 58
Singleton Pattern 58
Singleton类 59
Main类 59
Singleton Pattern的所有参与者 60
扩展自我视野的提示 61
设限的理由 61
惟一对象实例产生的时间点 61
相关Pattern 61
重点回顾 61
练习题 62
第6章 Prototype(原型)——复制建立对象实例 63
Prototype Pattern 64
程序示例 65
Manager类 66
Product接口 66
MessageBox类 67
UnderlinePen类 68
Main类 69
Prototype Pattern的所有参与者 70
扩展自我视野的提示 71
难道真的不能利用类来建立对象实例吗 71
类名是一种束缚 72
相关Pattern 72
深入说明:clone方法和java.lang.Cloneable接口 73
Java语言的clone 73
clone方法是在哪里定义 73
Cloneable所要求的方法是什么 73
练习题 74
clone方法做的是浅拷贝(shallow copy) 74
重点回顾 74
第7章 Builder(生成器)——组合复杂的对象实例 75
Builder Pattern 76
程序示例 76
Builder类 77
Director类 77
TextBuilder类 78
HTMLBuilder类 79
Main类 80
Builder Pattern的所有参与者 83
相关Pattern 84
在设计时该决定哪些事、又不该决定哪些事 85
谁知道哪个部分 85
扩展自我视野的提示 85
源代码的解读与修改 86
重点回顾 86
练习题 86
第8章 Abstract Factory(抽象工厂)——把相关零件组合成产品 89
Abstract Factory Pattern 90
程序示例 90
抽象零件:Item类 94
抽象零件:Link类 95
抽象零件:Tray类 95
抽象产品:Page类 96
抽象工厂:Factory类 97
利用工厂把零件组合成产品:Main类 98
具体零件:ListLink类 100
具体工厂:ListFactory类 100
具体零件:ListTray类 101
具体产品:ListPage类 102
在程序示例中新增其他的具体工厂 103
具体工厂:TableFactory类 105
具体零件:TableLink类 106
具体零件:TableTray类 106
具体产品:TablePage类 107
Abstract Factory Pattern的所有参与者 108
扩展自我视野的提示 110
新增具体工厂尤如探囊取物 110
新增零件很有难度 110
相关Pattern 110
深入说明:各种建立对象实例的手段 111
练习题 112
重点回顾 112
第4部分 切割性思考 113
第9章 Bridge(桥接)——分成功能层次和实现层次 113
Bridge Pattern 114
类层次的两大责任 114
程序示例 116
功能的类层次:Display类 116
功能的类层次:CountDisplay类 117
实现的类层次:DisplayImpl类 118
实现的类层次:StringDisplayImpl类 118
Main类 119
Bridge Pattern的所有参与者 121
扩展自我视野的提示 121
先区分再扩充就很轻松 121
继承是生死不离、委托是潇洒分手 122
相关Pattern 123
重点回顾 123
练习题 123
第10章 Strategy(策略)——把算法整个换掉 125
Strategy Pattern 126
程序示例 126
Hand类 127
Strategy接口 129
WinningStrategy类 129
ProbStrategy类 130
Player类 132
Main类 133
Strategy Pattern的所有参与者 135
执行时也可切换 136
为什么要特地建立Strategy参与者 136
扩展自我视野的提示 136
相关Pattern 137
重点回顾 137
练习题 137
第5部分 一视同仁 141
第11章 Composite(组成)——对容器和内容一视同仁 141
Composite Pattern 142
程序示例 142
Entry类 143
File类 144
Directory类 145
FileTreatmentException类 147
Main类 147
单、复数的一视同仁 150
扩展自我视野的提示 150
Composite Pattern的所有参与者 150
add放在哪里 151
递归结构随时都会出现 152
相关Pattern 152
重点回顾 152
练习题 152
第12章 Decorator(装饰)——对装饰和内容一视同仁 155
Decorator Pattern 156
程序示例 156
Display类 157
StringDisplay类 158
Border类 159
SideBorder类 159
FullBorder类 161
Main类 162
Decorator Pattern的所有参与者 163
扩展自我视野的提示 164
可穿透的接口(API) 164
可新增功能但内容不变 165
可新增动态功能 165
即使只有简单的种类规划,也可增加多种功能 165
java.io包和Decorator Pattern 166
小类多了一点 167
相关Pattern 167
深入说明:继承和委托的一视同仁 167
继承——对子类和父类一视同仁 167
委托——对自己和委托对象一视同仁 168
重点回顾 169
练习题 170
第6部分 在结构中穿梭来去 173
第13章 Visitor(访问者)——在结构中穿梭还同时做事 173
Visitor Pattern 174
程序示例 174
Visitor类 174
Acceptor接口 176
Entry类 176
File类 177
Directory类 178
ListVisitor类 179
FileTreatmentException类 180
Main类 180
Visitor和Acceptor两边彼此调用 182
Visitor Pattern的所有参与者 183
双重调度(double dispatch) 184
扩展自我视野的提示 184
为什么要搞得这么复杂 185
The Open-Closed Principle——扩充时开放、修改时关闭 185
新增ConcreteVisitor参与者?简单 186
新增ConcreteAcceptor参与者?复杂 186
Visitor要怎样做才能进行处理 186
相关Pattern 186
重点回顾 187
练习题 187
第14章 Chain of Responsibility(职责链)——责任转送 191
Chain of Responsibility责任转送 192
程序示例 192
Support类 193
Trouble类 193
NoSupport类 195
LimitSupport类 195
OddSupport类 196
SpecialSupport类 196
Main类 197
Chain of Responsibility Pattern的所有参与者 198
扩展自我视野的提示 199
让要求跟处理要求两者间的结合关系不会太紧密 199
机动性改变连锁形态 200
能更专心在自己的工作岗位上 200
转送会不会导致处理变慢 200
重点回顾 201
练习题 201
相关Pattern 201
第7部分 简单最好 203
第15章 Facade(外观)——单一窗口 203
Facade单一窗口 204
程序示例 204
Database类 206
HtmlWriter类 206
PageMaker类 208
Main类 209
Facade Pattern的所有参与者 210
扩展自我视野的提示 211
Facade参与者到底在做什么事 211
Facade Pattern的递归应用 211
程序设计师拒绝使用Facade的理由——敏感的心理因素 211
练习题 212
相关Pattern 212
重点回顾 212
第16章 Mediator(中介者)——只要面对一个顾问 215
Mediator Pattern 216
程序示例 216
Mediator接口 220
Colleague接口 220
ColleagueButton类 221
ColleagueTextField类 222
ColleagueCheckbox类 223
LoginFrame类 224
Main类 227
Mediator Pattern的所有参与者 227
哪些可以再利用 229
通讯路径数量暴增 229
扩展自我视野的提示 229
当分散变成灾难时 229
相关Pattern 230
重点回顾 230
练习题 230
第8部分 管理状态 231
第17章 Observer(观察者)——通知状态变化 231
Observer Pattern 232
程序示例 232
Observer接口 232
NumberGenerator类 233
RandomNumberGenerator类 234
DigitObserver类 235
GraphObserver类 235
Main类 236
Observer Pattern的所有参与者 237
扩展自我视野的提示 238
这里也可对换 238
Observer的顺序 239
Observer的行为影响Subject时 239
如何处理更新的提示 239
“通知”的意义重于“观察” 240
Model/View/Controller(MVC) 240
补充说明:java.util.Observer接口 241
相关Pattern 241
重点回顾 241
练习题 242
第18章 Memento(备忘录)——存储状态 243
程序示例 244
Memento Pattern 244
Memento类 245
Gamer类 246
Main类 248
Memento Pattern的所有参与者 252
扩展自我视野的提示 253
2种接口(API)与存取控制 253
Memento可以有几个 255
Memento有没有使用期限 255
Caretaker参与者跟Originator参与者区隔使用的意义 255
相关Pattern 255
重点回顾 256
练习题 256
第19章 State(状态)——以类表示状态 259
金库保安系统 260
State Pattern 260
程序示例 260
不使用State Pattern的虚拟程序代码 261
使用State Pattern的虚拟程序代码 262
State接口 263
DayState类 265
NightState类 266
Context接口 267
SafeFrame类 267
Main类 271
State Pattern的所有参与者 272
扩展自我视野的提示 273
分割统合 273
状态迁移该由谁管 274
有此状态才会有的处理 274
新增状态易如反掌 275
不会有自我矛盾 275
变化万千的对象实例 276
相关Pattern 276
重点回顾 277
练习题 277
第9部分 精简不浪费 279
第20章 Flyweight(享元)——有相同的部分就共享,采取精简政策 279
Flyweight Pattern 280
程序示例 280
BigChar类 285
BigCharFactory类 286
BigString类 287
Flyweight Pattern的所有参与者 289
Main类 289
扩展自我视野的提示 290
影响会传到所有相关位置 290
Intrinsic和extrinsic 291
管理中的对象实例不会被视为垃圾收集 291
非内存部分的记录 292
相关Pattern 293
重点回顾 293
练习题 293
第21章 Proxy(代理)——要用再建立 295
Proxy Pattern 296
程序示例 296
Printer类 298
PrinterProxy类 299
Printable接口 299
Main类 301
Proxy Pattern的所有参与者 301
扩展自我视野的提示 302
利用代理提高处理速度 302
不能让代理和本人合二为一吗 303
代理和委托 303
穿透性 303
HTTP proxy 304
各种Proxy 304
相关Pattern 304
重点回顾 305
练习题 305
第22章 Command(命令)——将命令写成类 307
第10部分 用类来表示 307
Command Pattern 308
程序示例 308
Command接口 309
MacroCommand类 310
DrawCommand类 311
Drawable接口 312
DrawCanvas类 312
Main类 314
Command Pattern的所有参与者 317
扩展自我视野的提示 319
命令应该要有的信息是什么 319
存储记录 319
转换器 320
练习题 322
重点回顾 322
相关Pattern 322
第23章 Interpreter(解释器)——以类来表达语法规则 325
Interpreter Pattern 326
迷你语言 326
迷你语言的命令 326
迷你程序示例 327
迷你语言的语法 330
终点表达式与非终点表达式 331
程序示例 331
Node类 332
ProgramNode类 333
CommandListNode类 334
CommandNode类 335
RepeatCommandNode类 336
PrimitiveCommandNode类 337
Context类 337
ParseException类 339
Main类 339
Interpreter Pattern的所有参与者 341
扩展自我视野的提示 342
还有其他不同的迷你语言吗 342
略过/读入 343
相关Pattern 343
重点回顾和最后的叮咛 343
练习题 344
附录 345
附录A 练习题的解答 345
附录B GoF的设计Pattern分类 435