《Head First 设计模式》笔记

在书架上摆了两年多了,以前不是很喜欢Java,所以一直没动这本书。最近看了点 Objective-C 代码,结果顿悟了,超脱了语言之争,拿这本书复习一遍设计模式。(还有什么语言比 Objective-C 更啰嗦吗?但是Objective-C的动态特性写起来却十分顺手。)

update:比 Objective-C 更啰嗦的语言是…………Swift!

Stragety

策略模式的思想就是“面向接口“编程。策略模式在各类OO语言中随处可见。通过接口,规定了某个对象所需要满足的”协议“,子类通过为接口中声明的方法提供具体实现来完成具体行为。

C++语言中策略模式需要通过……。Java 与 C# 更是可以直接定义 interface ,说明这些语言在设计时就已经贯彻了面向接口编程的思想。

Observer

观察者模式。

Decorator

装饰者模式。

Factory

工厂模式。

作为 GISer,其实很早就接触过工厂模式。ArcGIS Engine for .NET 中大量使用工厂模式,来处理 Workspace、图层这些可以”批量生产”的对象。阅读代码的时候发现有很多不同的子类实现了大体上差不多,彼此之间又有细微差别的功能,这往往就是在使用工厂模式。

Singleton

单例模式(书里翻译成单件,可能是对岸的译法)。

Command

命令模式。

书中介绍命令模式用了一个餐厅的例子作引子,刚开始阅读的时候对餐厅例子中的各个角色与命令模式中的类的对应关系十分不适应,个人觉得效果还不如直接用遥控器的例子好。

命令模式通过对命令的设置与执行过程加以抽象,实现了命令调用者与命令执行者之间的解耦。

Adapter & Facade

适配器模式与外观模式。

使用外观模式要注意最小知识原则。最直白的要求是,不要出现层级的依赖。例如 Java 中的 Sys.out.println(),万一未来某个 Java 版本更改了 outprintln() 方法,那之前的历史代码都要悲剧。

Template Method

模板方法模式。不仅可以对方法进行抽象,还可以对方法的执行顺序进行抽象。多个方法按照预先设定的顺序先后执行,成为一个算法。

模板方法模式中,基类(一个抽象类,包括一些抽象方法)确定某个方法调用其他方法的顺序,子类则可以修改其他每个方法的具体细节。用书中的话来说,模板方法模式在一个方法定义一个算法的骨架、一系列步骤,每一步的具体实现延迟到子类中。

使用钩子实现依赖反转

所有框架都是基于模板方法的思想。

Iterator

迭代器模式。

State

状态模式。

代理模式

小结

这本书里的模式都是用 Java 实现的,下一步打算用 Python 重写一遍书里的例子。

"Your value as a developer is measured not in the height of your peaks, but the area under your line". http://t.co/6JMyGvGuzl

-- Peter Nixey (@peternixey)

最后提醒一下自己,要不要学某个技术,不应该受第一印象的影响(比如 Java 的语法不如 C# 的性感,还被毁人不倦的 Oracle 收购?)。目前做大型 Web 应用,Java 依旧是最佳选择。语法漂不漂亮性不性感,不是最重要的。

无非是开发效率和运行效率的取舍而已。