HEAD IN DESIGN PATTERNS读书笔记——STRATEGY模式
上一篇 /
下一篇 2007-06-24 10:06:05
/ 个人分类:软件设计
应用程序:小鸭模拟程序(MiniDuckSimulator)
问题的提出:
初始的情况是这样的:Duck类中包含了quack()和swim()方法,以及一个抽象方法display()(Duck实际上为抽象类)。MallardDuck,RedheadDuck以及其他许多鸭子类都继承了Duck类。
之后增加了一个新的需求,就是在这个鸭子模拟系统中需要增加会飞的鸭子。程序员Joe认为只要在Duck类中增加一个fly()方法就可以了。
但事实并不是这么简单。上面代码的直接结果是橡皮鸭也开始在屏幕上飞来飞去了,而这是不合逻辑的。事实上上面代码等于把fly()方法赋予了所有Duck类的子类,而其中许多都是不会飞的鸭子。
一种解决方式是在子类中修改fly()的行为,将橡皮鸭的fly()方法改成什么也不做。但同时存在另一些情况比如木头鸭既不会呷呷叫也不会飞。同时Joe知道接下来每半年要更新一次产品加入一些新的变更,他需要不断的为每一个新加入的子类修改fly()和quack()的实现……
于是Joe想到了使用接口,把fly()方法和quack()方法从Duck类中分离出来,抽象成两个接口Flyable和Quackable:
但是这样的代码可重用性很差,因为即便是能飞的鸭子,飞行的行为也可能不只一种。
解决方案:
这里Duck类通过performQuack()和performFly()方法把quack()和fly()代理给了两个接口类,可以在运行时为Duck的子类设置具体的行为类,此时根据子类中包含的具体行为类对象决定具体的fly(),quack()行为。
使用HAS-A的组成来创建系统提供了很大的灵活性。不仅可以把封装一组算法封装进自身的一组类,而且可以在运行时改变行为,只要用来组成系统的对象实现了正确的行为类。
收藏
举报
TAG:
软件设计
DESIGN
PATTERN