Design Patterns Part I
Chapter One 策略模式
1. 鸭子要加入 fly() 函数, 于是考虑在基类 duck中加入虚函数分别在子类予以实现. 但结论却是, 当涉及维护时, 为了复用目的而是用继承, 结局并不完美.
2. 考虑使用接口, 比如有一个 flyable(), Quackable() 等等, 只有会飞的鸭子才继承 Flyable 接口中. 但这种方法会造成代码无法重用.
结论, 软件开发上的不变真理是 CHANGE
设计原则: 找出应用中可能需要变化之处, 把它们独立出来, 不要和那些不需要变化的代码混在一起.
所以, 把 Duck 类中易于变化的部分抽取出来, 放在别的类结构中. 现在飞行和呱呱叫都有它们自己的类.
那么, 如何设计鸭子的行为呢?
针对接口编程, 而不是针对实现编程.
这里, 抽象出接口 FlyBehavior, 然后实现两个子类, FlyWithWings 和 FlyNoWay. 真正用到
还可以设置行为
设计模式原则: 多用组合, 少用继承
上面所写, 就是策略模式
Chapter Two Visitor Strategy
当你想要为一个对象的组合增加新的能力, 且封装部重要时, 就可以使用访问者模式
这个模式的基本想法如下: 首先我们要有一个由许多对象组成的结构对象, 这些对象的类都用于 accept 方法用来接受访问者对象. 访问者是一个接口, 它拥有一个 visit 方法, 这个方法对访问对象结构中的不同类型元素做出不同的反应; 在对象结构的一次访问中, 我们遍历整个对象结构, 对每一个对象实施 accept 方法, 在每一个元素的 accept 方法中回调 visit 方法, 从而使访问者得以处理对象结构的每一个元素. 我们可以针对对象结构设计不同的实在访问者完成不同的操作.
Wiki 上给出非常易于理解的例子: http://zh.wikipedia.org/wiki/%E8%AE%BF%E9%97%AE%E8%80%85%E6%A8%A1%E5%BC%8F#Java.E7.9A.84.E4.BE.8B.E5.AD.90
另外, Wiki 的最后还给出 HTML 解析时应用 Visitor 的示例. 这就是我在面 E 家时面试官问我的问题, Visitor 模式