内容简介
本书在尊重《设计模式》初衷的同时,全面介绍了16种比较适合JavaScript程序员的常用设计模式,讲解了JavaScript面向对象和函数式编程的基础知识,介绍了面向对象的设计原理及其在设计模式中的体现,分享了日常开发中的面向对象编程技巧和代码重构。这本书将教你如何将经典的设计模式应用到JavaScript语言中,写出美观高效的代码、以及结构化和可维护的代码。
目录
- 第一部分基础知识
- 第1章面向对象的JavaScript
- 1.1动态类型语言和鸭子类型2
- 1.2多态4
- 1.3封装12
- 1.4原型模式和基于原型继承的JavaScript对象系统14
- 第2章this、call和apply
- 2.1this24
- 2.2call和apply29
- 第3章闭包和高阶函数
- 3.1闭包35
- 3.2高阶函数44
- 3.3小结58
- 第二部分设计模式
- 第4章单例模式
- 4.1实现单例模式60
- 4.2透明的单例模式61
- 4.3用代理实现单例模式62
- 4.4JavaScript中的单例模式63
- 4.5惰性单例65
- 4.6通用的惰性单例68
- 4.7小结70
- 第5章策略模式
- 5.1使用策略模式计算奖金72
- 5.2JavaScript版本的策略模式75
- 5.3多态在策略模式中的体现76
- 5.4使用策略模式实现缓动动画76
- 5.5更广义的“算法”80
- 5.6表单校验80
- 5.7策略模式的优缺点86
- 5.8一等函数对象与策略模式86
- 5.9小结87
- 第6章代理模式
- 6.1第一个例子——小明追MM的故事88
- 6.2保护代理和虚拟代理91
- 6.3虚拟代理实现图片预加载91
- 6.4代理的意义93
- 6.5代理和本体接口的一致性94
- 6.6虚拟代理合并HTTP请求95
- 6.7虚拟代理在惰性加载中的应用97
- 6.8缓存代理99
- 6.9用高阶函数动态创建代理100
- 6.10其他代理模式101
- 6.11小结102
- 第7章迭代器模式
- 7.1jQuery中的迭代器103
- 7.2实现自己的迭代器104
- 7.3内部迭代器和外部迭代器104
- 7.4迭代类数组对象和字面量对象106
- 7.5倒序迭代器106
- 7.6中止迭代器107
- 7.7迭代器模式的应用举例107
- 7.8小结109
- 第8章发布—订阅模式
- 8.1现实中的发布—订阅模式110
- 8.2发布—订阅模式的作用110
- 8.3DOM事件111
- 8.4自定义事件112
- 8.5发布—订阅模式的通用实现113
- 8.6取消订阅的事件115
- 8.7真实的例子——网站登录115
- 8.8全局的发布—订阅对象117
- 8.9模块间通信119
- 8.10必须先订阅再发布吗120
- 8.11全局事件的命名冲突121
- 8.12JavaScript实现发布—订阅模式的便利性124
- 8.13小结124
- 第9章命令模式
- 9.1命令模式的用途125
- 9.2命令模式的例子——菜单程序126
- 9.3JavaScript中的命令模式128
- 9.4撤销命令130
- 9.5撤消和重做132
- 9.6命令队列134
- 9.7宏命令134
- 9.8智能命令与傻瓜命令135
- 9.9小结136
- 第10章组合模式
- 10.1回顾宏命令138
- 10.2组合模式的用途139
- 10.3请求在树中传递的过程139
- 10.4更强大的宏命令140
- 10.5抽象类在组合模式中的作用143
- 10.6透明性带来的安全问题144
- 10.7组合模式的例子——扫描文件夹145
- 10.8一些值得注意的地方147
- 10.9引用父对象148
- 10.10何时使用组合模式150
- 10.11小结150
- 第11章模板方法模式
- 11.1模板方法模式的定义和组成151
- 11.2第一个例子——CoffeeorTea151
- 11.3抽象类156
- 11.4模板方法模式的使用场景159
- 11.5钩子方法160
- 11.6好莱坞原则162
- 11.7真的需要“继承”吗162
- 11.8小结164
- 第12章享元模式
- 12.1初识享元模式165
- 12.2内部状态与外部状态166
- 12.3享元模式的通用结构167
- 12.4文件上传的例子167
- 12.5享元模式的适用性173
- 12.6再谈内部状态和外部状态173
- 12.7对象池175
- 12.8小结178
- 第13章职责链模式
- 13.1现实中的职责链模式179
- 13.2实际开发中的职责链模式180
- 13.3用职责链模式重构代码181
- 13.4灵活可拆分的职责链节点183
- 13.5异步的职责链184
- 13.6职责链模式的优缺点185
- 13.7用AOP实现职责链186
- 13.8用职责链模式获取文件上传对象187
- 13.9小结188
- 第14章中介者模式
- 14.1现实中的中介者190
- 14.2中介者模式的例子——泡泡堂游戏191
- 14.3中介者模式的例子——购买商品199
- 14.4小结207
- 第15章装饰者模式
- 15.1模拟传统面向对象语言的装饰者模式210
- 15.2装饰者也是包装器211
- 15.3回到JavaScript的装饰者212
- 15.4装饰函数212
- 15.5用AOP装饰函数214
- 15.6AOP的应用实例216
- 15.7装饰者模式和代理模式222
- 15.8小结223
- 第16章状态模式
- 16.1初识状态模式224
- 16.2状态模式的定义230
- 16.3状态模式的通用结构230
- 16.4缺少抽象类的变通方式231
- 16.5另一个状态模式示例——文件上传232
- 16.6状态模式的优缺点241
- 16.7状态模式中的性能优化点241
- 16.8状态模式和策略模式的关系241
- 16.9JavaScript版本的状态机242
- 16.10表驱动的有限状态机244
- 16.11实际项目中的其他状态机245
- 16.12小结245
- 第17章适配器模式
- 17.1现实中的适配器246
- 17.2适配器模式的应用247
- 17.3小结250
- 第三部分设计原则和编程技巧
- 第18章单一职责原则
- 18.1设计模式中的SRP原则252
- 18.2何时应该分离职责256
- 18.3违反SRP原则256
- 18.4SRP原则的优缺点257
- 第19章最少知识原则
- 19.1减少对象之间的联系258
- 19.2设计模式中的LKP原则259
- 19.3封装在LKP原则中的体现261
- 第20章开放-封闭原则
- 20.1扩展window.onload函数263
- 20.2开放和封闭264
- 20.3用对象的多态性消除条件分支265
- 20.4找出变化的地方266
- 20.5设计模式中的开放—封闭原则268
- 20.6开放—封闭原则的相对性270
- 20.7接受第一次愚弄270
- 第21章接口和面向接口编程
- 21.1回到Java的抽象类271
- 21.2interface276
- 21.3JavaScript语言是否需要抽象类和interface275
- 21.4用鸭子类型进行接口检查277
- 21.5用TypeScript编写基于interface的命令模式278
- 第22章代码重构
- 22.1提炼函数282
- 22.2合并重复的条件片段283
- 22.3把条件分支语句提炼成函数284
- 22.4合理使用循环285
- 22.5提前让函数退出代替嵌套条件分支285
- 22.6传递对象参数代替过长的参数列表286
- 22.7尽量减少参数数量287
- 22.8少用三目运算符288
- 22.9合理使用链式调用288
- 22.10分解大型类289
- 22.11用return退出多重循环290
- 参考文献293
理论结合实际,里面很多结合实际应用的实例程序,学习设计模式实际应用很不错的书,不过作者使用的是JavaScript,对于现代脚本语言很多设计模式都是天然融入其中的。如果你想看通俗一点的奖金方式我推荐《head first设计模式》和《设计模式之禅》。如果你是游戏从业者想要学习设计模式在游戏开发中的实际应用,我推荐《游戏编程模式》和《设计模式与游戏完美开发》。
之前看过《javascript模式》一书,那是一本颇受好评的书籍。而本书则是在设计模式上对模式一书的进一步扩充。
本书的一大特点就是结合实际,代码较完整,能直接应用到实际开发中,不过从作者的代码书写风格和严谨方面考虑来说,书中有一些错误。
难得的中文好书,由浅入深,娓娓道来。虽有小瑕疵(都在笔记里列出),但绝对是一本值得反复研读的好书。