先从简单的模拟鸭子应用做起
使用继承,所有的鸭子都会呱呱叫Quack(),也会游泳Swim(),所以由超类负责处理这部分的代码,
现在我们得让鸭子能飞
在Duck类中加上fly()方法,然后 所有的鸭子都会继承fly()。
但是,可怕的问题发生了
忽略了一件事情,并非Duck所有的子类都会飞。
当涉及"维护"时,为了复用目的而使用继承,结局不完美。
使用继承,可是如果以后加入的诱饵鸭,不会飞也不会叫。
总结:利用继承来提供Duck的行为,会导致以下缺点:
代码在多个子类中重复。很难知道所有鸭子的行为,运行时的行为不容易改变。
是时候开始新的想法啦
利用接口如何?
可以把fly()从超类中取出来放到Flyable接口中,这样会飞的鸭子都实现这个接口,同样的方式,设计一个Quackable接口,因为不是所有的鸭子都会叫。
问题是Flyble和Quackable可以解决部分问题,但是却造成了代码无法复用。
如果能有一种建立软件的方法,好让我们可以用一种对既有的代码影响最小的方式来修改软件该多好。
软件开发的一个不变真理change
把问题归零
设计原则
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。把会变化的部分取出并''封装"起来,好让其他部分不受影响。
分开变化和不会变化的部分
把飞行和呱呱叫的行为放在别的类结构中
设计鸭子的行为
如何设计飞行和呱呱叫的类呢
设计原则:针对接口编程,而不是实现编程。
针对接口编程的真正意思是针对超类型编程
实现鸭子的行为
有两个接口,FlyBehavior和QuackBehavior,还有他们对应的类。