本书的赞誉 2
译者序 2
序 2
前言 2
致谢 2
第一部分 设计模式和Ruby 2
第1章 使用设计模式创建更好的程序 2
1.1 四人组 2
1.2 模式的模式 3
1.2.1 把变和不变的事物分开 3
1.2.2 针对接口编程而不对实现编程 3
1.2.3 组合优先于继承 5
1.2.4 委托、委托、委托 8
1.2.5 你不会用到它 9
1.3 23种模式中的14种 10
1.4 Ruby中的设计模式 12
第2章 从Ruby起步 13
2.1 交互式Ruby 13
2.2 说helloworld 14
2.3 变量 15
2.4 Fixnums和Bignums 17
2.5 浮点数 18
2.6 这里没有原始类型 18
2.7 但是有时没有对象 19
2.8 true、false和til 19
2.9 判定、判定 21
2.10 循环 22
2.11 更多关于字符串 24
2.12 符号 27
2.13 数组 27
2.14 散列 29
2.15 正则表达式 29
2.16 自己的类 30
2.17 获取一个实例变量 31
2.18 对象问:我是谁 33
2.19 继承、子类和超类 34
2.20 参数选项 35
2.21 模组 36
2.22 异常 38
2.23 线程 39
2.24 管理分散的源文件 40
2.25 本章回顾 41
第二部分 Ruby中的模式 44
第3章 使用模板方法变换算法 44
3.1 迎接现实中的挑战 45
3.2 将不变的部分独立出来 46
3.3 探究模板方法模式 48
3.4 钩子方法 49
3.5 但是类型声明都去哪里了 51
3.6 类型、安全和灵活性 52
3.7 单元测试并非可有可无 53
3.8 使用和滥用模板方法模式 55
3.9 模板方法模式的实际应用 56
3.10 本章回顾 57
第4章 使用策略替换算法 58
4.1 委托、委托、还是委托 58
4.2 在策略和环境中共享数据 60
4.3 再说鸭子类型 62
4.4 Proc和代码块 63
4.5 快速而随性的策略对象 66
4.6 使用和滥用策略模式 68
4.7 策略模式的实际应用 68
4.8 本章回顾 69
第5章 通过观察器保持协调 71
5.1 随时待命 71
5.2 更好的随时待命方法 73
5.3 提取可被观察能力支持的代码 75
5.4 使用代码块作为观察器 78
5.5 观察器模式的异体 79
5.6 使用和滥用观察器模式 80
5.7 观察器模式的实际应用 81
5.8 本章回顾 83
第6章 使用组合模式将各部分组成整体 84
6.1 整体和部分 84
6.2 创建组合 86
6.3 使用运算符将组合模式打扮整齐 89
6.4 给予数组的组合类 90
6.5 一种不方便的差异 91
6.6 给各层次指明方向 91
6.7 使用和滥用组合模式 93
6.8 组合模式的实际应用 94
6.9 本章回顾 96
第7章 通过迭代器遍历集合 97
7.1 外部迭代器 97
7.2 内部迭代器 99
7.3 比较内部迭代器和外部迭代器 100
7.4 无可比拟的Enumerable 101
7.5 使用和滥用迭代器模式 103
7.6 迭代器的实际应用 104
7.7 本章回顾 107
第8章 使用命令模式完成任务 109
8.1 子类大泛滥 109
8.2 一个更简便的方法 110
8.3 代码块即命令 111
8.4 用于记录操作的命令 112
8.5 使用命令取消一个操作 115
8.6 命令队列 117
8.7 使用和滥用命令模式 118
8.8 命令模式的实际应用 119
8.8.1 ActiveRecord数据移植 119
8.8.2 Madeleine 119
8.9 本章回顾 123
第9章 使用适配器填补空隙 124
9.1 软件适配器 124
9.2 几乎错过 127
9.3 适配器的另一种选择 128
9.4 修改单个实例 129
9.5 适配还是修改 131
9.6 使用和滥用适配器模式 131
9.7 适配器模式的实际应用 132
9.8 本章回顾 132
第10章 通过代理来到对象面前 134
10.1 使用代理进行拯救 134
10.2 保护代理 136
10.3 远程代理 137
10.4 虚拟代理让人变懒 138
10.5 取消代理的苦差事 140
10.5.1 消息传递和方法 140
10.5.2 method_missing方法 141
10.5.3 发送消息 142
10.5.4 无痛的代理 142
10.6 使用和滥用代理 145
10.7 代理模式的实际应用 146
10.8 本章回顾 147
第11章 使用装饰器改善对象 148
11.1 装饰器:丑陋代码的解药 148
11.2 正式装饰 153
11.3 减轻代理的郁闷 154
11.4 实现装饰器模式的另一种动态方法 155
11.4.1 装饰方法 155
11.4.2 使用模组进行装饰 155
11.5 使用和滥用装饰器模式 156
11.6 装饰器的实际应用 157
11.7 本章回顾 158
第12章 使用单例确保仅有一个 159
12.1 一个对象,全局访问 159
12.2 类变量和类方法 159
12.2.1 类变量 159
12.2.2 类方法 160
12.3 Ruby单例应用的第一次尝试 162
12.3.1 管理单个实例 163
12.3.2 确保只有一个 163
12.4 单例模组 164
12.5 勤性单例和惰性单例 165
12.6 其他单例模式的实现方法 165
12.6.1 使用全局变量作为单例 165
12.6.2 使用类作为单例 166
12.6.3 使用模组作为单例 167
12.7 安全带还是拘束衣 168
12.8 使用和滥用单例模式 169
12.8.1 实际上就是全局变量 169
12.8.2 到底需要多少这样的单例 170
12.8.3 在需要知道的基础上的单例 170
12.8.4 减轻测试的郁闷 172
12.9 单例模式的实际应用 173
12.10 本章回顾 173
第13章 使用工厂模式挑选正确的类 174
13.1 一种不同的鸭子类型 174
13.2 模板方法再露一手 176
13.3 参数化的工厂方法 178
13.4 类也是对象 181
13.5 坏消息:你的程序搞大了 182
13.6 对象创建的组合 183
13.7 再论类就是对象 185
13.8 协调名字 186
13.9 使用和滥用工厂模式 187
13.10 工厂模式的实际应用 188
13.11 本章回顾 189
第14章 通过生成器简化对象创建 190
14.1 制造计算机 190
14.2 多态生成器 193
14.3 生成器能保证产生健全的对象 196
14.4 可重用的生成器 196
14.5 使用魔术方法制作更好的生成器 197
14.6 使用和滥用生成器模式 198
14.7 生成器模式的实际应用 198
14.8 本章回顾 199
第15章 使用解释器组建系统 200
15.1 用以完成任务的正确语言 200
15.2 构建一个解释器 201
15.3 一个文件查找解释器 202
15.3.1 查找所有文件 203
15.3.2 根据文件名查找文件 203
15.3.3 大文件和可写文件 204
15.3.4 加入Not、And和Or的更复杂的检索 205
15.4 创建AST 207
15.4.1 一个简单的分析器 207
15.4.2 没有分析器的解释器 209
15.4.3 让XML和YAML进行分析工作 210
15.4.4 为更复杂的分析器使用Racc 211
15.4.5 让Ruby作分析 211
15.5 使用和滥用解释器模式 211
15.6 解释器模式的实际应用 212
15.7 本章回顾 213
第三部分 Ruby的设计模式 216
第16章 采用域指定语言打开系统 216
16.1 特定语言的域 216
16.2 备份文件的DSL 217
16.3 是数据文件,更是程序 217
16.4 构建PackRat 218
16.5 将DSL合成一体 220
16.6 评估PackRat 221
16.7 改进PackRat 222
16.8 使用和滥用内部DSL 224
16.9 内部DSL的实际应用 225
16.10 本章回顾 226
第17章 使用元编程创建自定义对象 227
17.1 通过方法度身定制的对象和方法 227
17.2 通过模块自定义对象和模块 229
17.3 召唤出崭新的方法 230
17.4 到对象的内部看看 233
17.5 使用和滥用元编程 234
17.6 元编程的实际应用 235
17.7 本章回顾 238
第18章 惯例优于配置 239
18.1 一个优秀的用户界面—对于开发者 240
18.1.1 预期需求 240
18.1.2 让他们说一次 240
18.1.3 提供一个模板 241
18.2 一个消息中转器 241
18.3 选择适配器 243
18.4 载入类 244
18.5 增加一些安全性 246
18.6 帮助用户开始使用 248
18.7 评估消息中转器 249
18.8 使用和滥用惯例优于配置模式 250
18.9 惯例优于配置的实际应用 250
18.10 本章回顾 250
第19章 总结 252
附录 254