跳至主要内容

《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

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

评论

此博客中的热门博文

AutoHotKey 新手入门教程

AutoHotKey 真是一个好玩的工具!短短几行代码就是先了“窗口置顶”、“窗口透明”等功能,之前我还特意为此装了好几个小工具,现在都可以卸掉了。闲来无事,就把 Quick Start 翻译了一下,我没有逐字逐句地翻译,有时候我嫌原文罗嗦就用自己的话概括地描述了一下。 原文地址:http://www.autohotkey.com/docs/Tutorial.htm 教程目录 创建脚本 启动程序 模拟鼠标键盘 操纵窗口 输入 变量与剪切板 循环 操纵文件 其他特性 创建脚本 每个脚本都是一个纯文本文件,由一些能被 AutoHotKey.exe 执行的命令组成。一个脚本可能还包含 热键 和 热字符串 。如果没有热键和热字符串,脚本在启动的时候就会从头依次执行到尾。 创建一个新的脚本: 下载 并安装 AutoHotkey。 右击鼠标,选择 新建 -> 文本文档 。 输入文件名并确保以 .ahk 结尾。例如:Test.ahk。 右击文件,选择 编辑脚本 。 输入以下内容:#space::Run www.google.com 上一行的第一个字符 "#" 代表键盘上的 Windows 键;所以 #space 表示在按住 Windows 键后再按空格键。"::" 后面的命令会在热键激活后执行,在本例中则会打开谷歌主页。继续按下面步骤操作,来执行这个脚本: 保存并关闭该文件。 双击该文件来启动它。在系统托盘里会出现一个新图标。 按下 Windows 和空格键,网页会在默认的浏览器里打开。 右击系统托盘里的绿色图标可以退出或编辑当前脚本。 注意: 可以同时启动多个脚本,并且在系统托盘里都会有一个相应的图标。 每个脚本都能定义多个 热键 和 热字符串 。 想让某个脚本开机即启动,可以将它的 快捷方式放到开始菜单的启动目录里 。 启动程序 命令 Run 可以运行程序、打开文档、网页链接或快捷键。请参看以下示例: Run Notepad Run C:\My Documents\Address List.doc Run C:\My Documents\My Shortcut.lnk Run www.yahoo.com Run mailto:someone@somedoma

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 共享。

Shell中同时读多个文件

Shell中同时读多个文件 redraiment, 2009-08-23 一个文件分割成多个文件   有时需要提取文件中的一个或多个列元素生成新的文件,这一操作在 Shell 里很容易实现。比如有一个数据文件 data,有三列信息:姓名、学号、班级。 redraiment 0612800134 0601 christine 0612800136 0601 zb 0612800229 0602   现在需要这个文件的第一列和第二列信息分别存到文件 f1 和 f2 中,可以用 awk 提取,也可以用下面这个简单 shell 程序: #!/bin/sh while read f1 f2 f3 do      echo $f1 >> f1      echo $f2 >> f2 done 多个文件合并成一个文件   如果想把多个文件重新合并成一个多列文件,而不是追加到文件尾处。例如把上列中生成的 f1 和 f2 重新组成 join.txt 。这时需要同时操作多个文件,就像 C 语言中用 fopen 同时打开多个文件,在 shell 里也是类似的。只是在 shell 里叫做“文件描述符”,用“0-9”十个数字表示。其中 0、1、2 分别是系统的标准输入、输出、错误。“3-9”则由用户只有使用。我们就可以任选两个来重定向输入。脚本如下: #!/bin/sh exec 3< f1 exec 4< f2 while read f1 < & 3 && read f2 < & 4 do      echo $f1 $f2 >> join.txt done