跳至主要内容

《Head First Design Patterns》读书笔录(零)

前言:寒假在家昼夜不分疯狂地看了一个星期,一口气看完《Head First Design Patterns》,感觉还是意犹未尽。尤其是对最后一章一笔带过的9个模式感觉遗憾万分。于是再次把玩了一番整部书,把散落在其中的金子收集到一处,并记下自己的看法,以供以后欣赏~

模式的定义

模式:在某情境下,针对某问题的某种解决方案

  • 情境:应用某个模式的情况。这应该是不断重复出现的情况。

  • 问题:你想在某情境下达到的目标,但也可以是某情境下的约束。

  • 解决方案:这是我们的目标。一个通用的设计,用来解决约束,达到目标。

通俗版本:如果你发现自己处于某个情境下,面对着所欲达到的目标被一群约束影响着的问题,然而,你能够应用某个设计,克服这些约束并达到该目标,将你领向某个解决方案。

设计模式和我崇拜的武术

在我看来,“模式”就像武侠小说里的,大侠们使的武功招式(一个模式对应一种武功招式):

  1. 就是因为有了武功招式,才让专业习武者和市井流氓打架时的拳打脚踢区分开来;
    同理,设计模式等专业术语也让专业软件设计师和业余编程爱好者有了本质区别。

  2. 武功招式普遍都有一些很响亮的名字,比如太极里的“白鹤亮翅”;
    同样,每个设计模式都有一个形象贴切的名字,像“观察者模式”。

  3. 武功招式,都是由最基本的拳、掌、钩等(或者剑术的刺、劈等)基本招式组成,并以各门各派的“内功心法”为指导,形成能够强身健体、修身养性的招数;
    设计模式,同样是由最基本的基础元素:抽象、封装、多台、继承组成,并合理遵循贯彻Object-Oriented设计原则,产生富有弹性的类图结构和设计框架。

  4. 武功招式会被滥用,初学者做起事情来,处处都是有头有脸的招式,在木板上订枚钉子,好好的榔头不用,非要用什么一阳指、千斤坠;
    设计模式同样会有如此尴尬,初学者“为了用设计模式而用设计模式”,甚至扬言写个Hello World也要用设计模式,这时候就病入膏肓了。

  5. 《笑傲江湖》中,风清扬教令狐冲“独孤九剑”的时候,倾囊相授之后要他尽数忘记。以后在比剑的过程中随心所欲,想起那一招就使出哪一招。
    悟道(编程之道)者的心智能够看到模式在何处能够自然融入,不必去思考这个地方用“策略模式”好还是用“模板方法模式”好,一切顺其自然。

  6. 武学的一种高境界,是无招胜有招,因为但凡是招式,就有其弱点,能被相克的招式破解,而且并不是人人都能练好这一招一式;
    编程亦是如此,每个模式虽然威力强劲,但都是比较复杂的实现方式,而且各自都有相对的适用范围和使用后果(好的或坏的)。

  7. 学习武功招式,最美妙的地方就是能和其他习武者一起切磋改进,还能相互学习;
    设计模式的绝顶妙处也是让你和其他设计者有共同语言,并且不用重复制造车轮。

  8. 武学宗师能够自创武功;
    设计大师同样挖掘模式。

  9. 武功有欣赏价值;
    设计有艺术气息。

Object-Oriented设计原则

  1. 封装变化(Page 9

  2. 针对接口编程,不针对实现编程(Page 11

  3. 多用组合,少用继承(Page 23

  4. 松散耦合原则(Page 53

  5. 开闭原则(Page 86

  6. 依赖倒置原则(Page 139

  7. 最少知识原则(Page 265

  8. 好莱坞原则(Page 296

  9. 单一责任原则(Page 339

我将分逐章详细讨论这九条原则。

评论

此博客中的热门博文

JavaScript中的字符串乘法

JavaScript中的字符串乘法 redraiment, Date 原文 原文地址: http://www.davidflanagan.com/2009/08/string-multipli.html 原作者:David Flanagan In Ruby, the "*" operator used with a string on the left and a number on the right does string repetition. "Ruby"*2 evaluates to "RubyRuby", for example. This is only occasionally useful (when creating lines of hyphens for ASCII tables, for example) but it seems kind of neat. And it sure beats having to write a loop and concatenate n copies of a string one at a time--that just seems really inefficient. I just realized that there is a clever way to implement string multiplication in JavaScript: String.prototype.times = function(n) {     return Array.prototype.join.call({length:n+1}, this); }; "js".times(5) // => "jsjsjsjsjs" This method takes advantage of the behavior of the  Array.join()  method for arrays that have undefined elements. But it doesn't even bother creating an array with n+1 undefined ele...

DAO层测试

<dependency> <groupId>com.wix</groupId> <artifactId>wix-embedded-mysql</artifactId> <version>2.1.4</version> <scope>test</scope> </dependency> 利用 wix-embedded-mysql 把MySQL嵌入到进程中,作为内存型的MySQL来做单元测试。 脚本: resources/migrations/mysql/<database>/<timestamp>_<action>.sql 但多个项目需要共享数据库脚本,可能可以用 git submodule 共享。

人所不欲,勿施于人

谁说博客也要像论文一样结构清晰、有条理?! 软件卸载 昨天整理自己的本本,卸载了 VMware 7.0 + 深度XP,MS Office 2007 以及 Visual Basic 6.0。我承认这些都是盗版软件,不过剩下的应用程序都是自由软件(freeware)或免费软件(freeware),这下我的计算机“干净”了。闲来无事,我就细数了一下当初装这些软件的原因: VMware + XP:当初刚买本本的时候,正好在上软件工程实践,紧遵老师的教导“将自己的开发环境随身携带”,自然第一款软件就是装了虚拟机(学校机房里是肆无忌惮地用盗版 VMware),另外上课指定使用 Visio 作图,那也只好一起装了;当然,也有部分原因是因为某些人的计算机装的是 XP,我这边有个 XP 环境也是为了方便问题重现(我的本本预装了 Vista)。 MS Office 2007:在毕设期间,我也还是用 Open Office 和 WPS 2010,但现在公司用的却是 Office 2007(正版)。我这次卸载这款办公软件其实也是在提醒自己:工作的事情要在工作时间里完成! VB 6:你可能无法想象在我们科班的毕业设计中有多少是 VB6 项目,从大二开始,每逢毕业将至,总会有人来找我帮忙看那些不晓得从哪儿搜罗来的 VB6 代码,经不住软磨硬泡,我总会帮着改改;另一个原因在我自己,我一直下不了决心去学 MFC 等,所以但凡要做 GUI 程序,我都是拿 VB6 来画界面,再调用由 C 语言开发的 DLL 库,不过现在改用 QT,于是 VB6 可以功成身退了。 己所不欲,勿施于人 有些人就喜欢把自己的事全盘交托给别人来做,我一直不明白他们既然有精力去说服别人,为什么就没耐心自己去完成(所以我下面说人和人之间是无法理解的)。既然自己都认为这是无聊的事情,为什么偏偏又假设其他人会愿意无偿地帮你来完成呢? 两千多年前,孔老夫子提出“己所不欲,勿施于人”的观点,但到了今天,我听到关于这句话时的语境普遍是,A说:“那个XX东西你也不要了(或要了也没用),不如就让给我吧?”,B就义正言辞地反对:“那怎么可以!己所不欲,勿施于人嘛。” 己所甚欲,勿施于人 易中天老师在《百家讲坛》讲解诸子百家...