场景
做一套模拟鸭子的游戏。游戏中会出现各种鸭子,一边游泳一边咕咕叫。此系统内部设计应用了标准的的OO技术,设计了一个鸭子的超类,并让鸭子继承此超类。
需求增加了需要会飞的鸭子来将竞争者抛在后头。这时候的设计是
但是,可怕的事情发生了。。。
并非所有的鸭子都会飞,某些鸭子并不适合该行为,比如添加了一个橡皮鸭的种类就无法飞行。
对代码所做的局部修改,影响层面可不仅仅是局部。
此时一般程序员的想法是在橡皮鸭子类中重写父类的fly()方法,就好像覆盖quack()做法一样,可是再加上一个鸭子的种类既不会飞又不会叫。
这样出现的缺点是:
1.代码在多个子类中重复。
2.运行时的行为不容易改变。
3.很难知道所有鸭子的全部行为。
4.改变会牵一发动全身,造成其他鸭子不想要的改变。
显然这样的设计是不利于扩展的设计。那么该如何设计?请看下一节