评 Head First Design Pattern 08月05日(星期五)
http://blog.itpub.net/post/1476/37429
本来想趁着这周项目完成和暑假放假的难得的休息时间写点SpringFramework MVC深入分析的文章,然后再深入研究一下AOP的东西。可惜从itput上下载的一本电子书彻底改变了我的计划,呜呼,看来看书也会误事。这本书叫Head First Design Pattern,尽管以前听人说过这是本好书,而且得了Jolt震憾大奖,不过我当时好象不是太感兴趣。原因有二:第一,我对Jolt大奖的某些评奖有点感冒,比如去年中奖的《测试驱动开发实用指南》,虽然没仔细看,不过我觉得只是本很一般的书;而我最心爱的Expert One on One J2EE这样的经典名著从来没能得奖,今年Bruce Tate的那本当时我觉得不起眼的小书Better, faster, lighter Java居然能得技术类的震憾大奖,不知道评委的评审是什么标准。第二,我自认为看的设计模式的书虽然不算多,但也不少,而且常用的模式几乎都在项目中用过,呵呵,真是自我感觉良好。然而当我下载到这本书,经过大致浏览并看了相关评论后(能让Erich Gamma, Richard Helm, Ward Cunningham这样的大牛做出这么高的评价,这本书一定有它的独到之处。呵呵,偶最喜欢追星了),我忽然意识这是我必须要看的一本书。尽管扫描版不是那么的清晰,看着有点累,但是象我这种书迷是不在意这些的,好书是绝不能放过的,哈哈!显然这本书没有让我失望。
大致浏览这本书,会发现上面有好多的图片,好多好玩的对话,很多人会感觉这是一本轻松愉快的书。但是请记住:这本书不是花两天时间,一边看片,一边上网能读完的书,读这本书需要完全的集中精力,需要深入的思考,甚至做笔记。记得当年我看完Design Pattern Explained,总共只用了两天时间,感觉对它掌握得也相当不错。但是读完这本书我整整花了七天时间,而且读完一些章节后会感觉头脑有点爆炸。
这本书最大的优点是它的述事方式,实例、问答、图片、drama、采访、相互对话,各种各样刺激脑神经的方式都用上了,它让读者在读这本书的过程不停地进行互动、思考,难怪会这么累。不过只有这样的阅读才能带来最大的收获,各种模式的基本要点,在实例中的应用,模式间的细微差别,使用时的具体事项,看过这本书后都会有很大的加深。设计模式本身就是一种需要不断重复,不断实践,才能牢记并掌握的东西。记得以前经常听人说看GOF的Design Pattern看了五六遍,不知道他们看完后有多大收获,反正这种方法不适合我,Design Pattern我看过两遍以后就不看了,偶尔参考的时候才翻一下。我是那种需要不断有新东西来刺激才能学习的人,而这本Head first Design Pattern无疑是对我最好的刺激。从学习的角度来说,Head first Design Pattern绝对是比GOF的Design Pattern好很多的书,因为它的叙事方式远比Design Pattern那种平铺直叙的方法带来更大的头脑互动。
每一章的叙事的基本套路大概是这样的:1、提出一个设计上的问题。通常是现实生活中的例子,如设计会飞会叫的鸭子、天气数据监测、遥控器、卖咖啡、做Pizza等一系列有趣的问题。2、设计出一个比较滥的解决方案,然后问你这个解决方案有啥问题。3、分析这个解决方案存在的问题和缺陷,总结出它的缺陷,再提出比较合理的解决方案。中间会让用户互动地完成部分解决方案。4、将这个解决方案总结,最后变成设计模式,并给出了这种设计模式的定义。5、对这个模式进行升华,提出相关的注意事项和实际应用。6、最后给出总结。
当然每章中间会穿插好多有趣的东西,如重要的设计原则,对设计模式进行采访,两个模式之间的吵架,很多有启发性的问答,非常好玩的小故事等等。
当然这本书的亮点不仅仅是它的叙事方式,它还会提出很多我们以前不曾考虑或没仔细想过的一些问题。Observer模式里的push和pull方式的区别,Decorator模式会带来的问题,三种工厂模式的详细区别,singleton里要注意的多线程和多ClassLoader带来的问题,Command模式里的Invoker和Receiver角色,Template method里的hook,Iterator和Composite组合后的CompositeIterator。对dynamic proxy的分析是我见过最清楚、最好的讲解。甚至已经在Web应用中用滥了的MVC模式,看完之后都会有新的收获,因为Web上的MVC与传统的rich client的MVC差别太大了,看完之后会有恍然的感觉。
当然有些设计上的决定我还是觉得有点问题或不太同意。比如说第一章的Strategy模式使用后,我们接口里仍然会有performFly,虽然很多鸭子是不会飞的;Decorator模式里的例子不太有说服力,如果仅仅是计算饮料的价格,我觉得用Decorator模式完全是不必要的,简单的Composite会取得更好的效果,而且更直观;在Template method里硬把java的排序函数里Comparable接口的实现说成是Template method的一种变体,我仍然觉得牵强。不过无论如何,这绝对是一本可以打五星的好书。
《深入浅出设计模式》目录
引子
谁适合读这本书?
我们知道你的大脑在想什么
元认知
让你的大脑就范
技术审校
致谢
1 欢迎来到设计模式世界:设计模式入门
模拟鸭子应用
Joe想到继承
利用接口如何?
软件开发的不变真理
分开变化和不变部分
设计鸭子的行为
测试鸭子的代码
动态地设置行为
封装行为的大局观
“有一个”比“是一个”更好
策略模式
共享模式词汇的威力
我如何使用设计模式?
设计箱内的工具
习题解答
2 让你的对象知悉现况
气象观测站
认识观察者模式
出版者+订阅者=观罕者模式
五分钟短剧:观察主题
定义观察者模式
松耦合的威力
设计气象站
实现气象站
使用Java内建的观察者模式
java.util.Observable的黑暗面
设计箱内的工具
习题解答
……
3 装饰者模式:装饰对象
4 工厂模式:烘烤OO的精华
5 单件模式:独一无二的对象
6 命令模式:封装调用
7 适配器模式与外观模式:随遇而安
8 模板方法模式:封装算法
9 送代器与组合模式:管理良好的集合
10 状态模式:事物的状态
11 代理模式:控制对象访问
12 复合模式:模式中的模式
13 与设计模式相处:真实世界中的模式
A 附录A:剩下的模式