HEAD IN DESIGN PATTERNS读书笔记——STRATEGY模式

上一篇 / 下一篇  2007-06-24 10:06:05 / 个人分类:软件设计

  1. 第一个PATTERN: STRATEGY PATTERN

应用程序:小鸭模拟程序(MiniDuckSimulator)

问题的提出:

 

      初始的情况是这样的:Duck类中包含了quack()swim()方法,以及一个抽象方法display()Duck实际上为抽象类)。MallardDuckRedheadDuck以及其他许多鸭子类都继承Duck类。

之后增加了一个新的需求,就是在这个鸭子模拟系统中需要增加会飞的鸭子。程序员Joe认为只要在Duck类中增加一个fly()方法就可以了。

但事实并不是这么简单。上面代码的直接结果是橡皮鸭也开始在屏幕上飞来飞去了,而这是不合逻辑的。事实上上面代码等于把fly()方法赋予了所有Duck类的子类,而其中许多都是不会飞的鸭子。

一种解决方式是在子类中修改fly()的行为,将橡皮鸭的fly()方法改成什么也不做。但同时存在另一些情况比如木头鸭既不会叫也不会飞。同时Joe知道接下来每半年要更新一次产品加入一些新的变更,他需要不断的为每一个新加入的子类修改fly()quack()的实现……

于是Joe想到了使用接口,把fly()方法和quack()方法从Duck类中分离出来,抽象成两个接口FlyableQuackable

但是这样的代码可重用性很差,因为即便是能飞的鸭子,飞行的行为也可能不只一种。

 

解决方案:

这里Duck类通过performQuack()performFly()方法把quack()fly()代理给了两个接口类,可以在运行时为Duck的子类设置具体的行为类,此时根据子类中包含的具体行为类对象决定具体的fly(),quack()行为。

使用HAS-A的组成来创建系统提供了很大的灵活性。不仅可以把封装一组算法封装进自身的一组类,而且可以在运行时改变行为,只要用来组成系统的对象实现了正确的行为类。


TAG: 软件设计 DESIGN PATTERN

 

评分:0

我来说两句

Open Toolbar