会飞的鸭子----策略模式
一、模拟鸭子
二、会飞的鸭子
1、设计一(继承)
发生的问题:并非所有的鸭子都会飞。在Duck超类中添加fly()方法,会使得某些并不适合该行为的子类(如:橡皮鸭RubberDuck(会叫,不会飞)、诱饵鸭Decoy(木头假的,不会叫也不会飞))也具有该行为。当然,在子类中fly()方法体可以为空,但是有很多这样子类时,不是一种好的设计。
2、设计二(接口)
发生的问题:重复的代码会变多!例如:假设飞有两种形式,一种是在顺飞,另一种是倒飞。假设有20种子类,10种顺飞,10种倒飞,那么对于顺飞(或倒飞),每个子类都会重写一遍这样代码。其实只有两套代码,这里有大量重复。
三、3个设计原则
1、软件开发的一个不变真理:change。
不管当初软件设计得多好,一段时间后,总是要成长与改变。
2、设计原则1:封装变化。
把会变化的部分取出并“封装”起来,好让其他部分不会受到影响。
3、设计原则2:针对接口编程,而不是针对实现编程。
4、设计原则3:多用组合,少用继承。
四、重新设计(策略模式)
(1)这样的设计,可以让“飞行”和“呱呱叫”行为被其他的对象复用,因为这些行为已经与鸭子类无关了
(2)我们可以新增一些行为(如下蛋行为),而不会影响到既有的行为类(如飞行类和呱呱叫类),也不会影响“使用”到既有行为的鸭子类。