设计原则:找出应用中可能需要变化之处,把他们独立出来,不要和哪些不需要变化的代码混在一起。尽量使用面向接口编程而不是针对具体实现类编程。
在鸭子类的设计过程中,因为鸭子种类的变化,fly()和quack()会有不同,因此我们需要将这两个属性提取出来,新建一组新类来代表每个行为。每一种行为可以抽象为一个接口,然后创建一组类实现接口,通过不同的实现来表达不同的属性。之所以不采用鸭子类直接实现行为接口,是因为接口并未提供实现,无法达到代码复用的目的。这里采用组合的方式,使每个鸭子的子类都继承了成员变量从而继承相应的属性,从而实现代码复用。同时这样也更加灵活的控制鸭子的属性,通过提供一个方法,就可以改变鸭子的不同属性。