现在如果我们要让鸭子会飞,那么只需要在超类上添加方法即可:
这时候就出现了一个bug! 如果子类是塑料鸭或者残疾的鸭子,那岂不是也到处乱飞!!!
这是个严重的问题。所以在这时候又想到了用“继承”来解决 。
继承又会导致,如果出现诱饵鸭、橡皮鸭。总不能每次都去覆盖父类的方法吧。拓展性极差。
所以决定改用接口来解决此问题,将fly和quack两个行为从父类抽离出来,放到接口中,这样让会飞会叫的鸭子去实现该接口,而对于诱饵鸭这种不会飞不会叫的鸭子则不去实现接口。
虽然Flyable和Quanckable接口可以解决部分问题,但是却造成代码难以复用。所有具备飞行和吱吱叫的鸭子都需要实现一遍接口,只能说是从一个噩梦进到另一个噩梦。这时候就要依赖涉设计模式了。
再来一个设计原则:
其实此时使用接口方案并非最优,对于鸭子的飞行和吱吱叫行为使用抽象超类,这样就可以使用多态实现了。
那现在就让我们继续实现鸭子的行为吧!
---- 现在整合一下Duck超类。
每当要新出一个鸭子模型,就可以这样实现。
此时我们又会发现新的问题出现了。在构造方法定义出具体的飞行实现和吱吱叫的实现。与之前所说的“不对具体实现编程”背道而驰了。下面的改造可以帮我们解决这一问题。顺便我们可以把对鸭子的设计整体做一个测试了。
这样的设计就是我们目前所期望的了。鸭子extends 类Duck;飞行行为实现FlyBehavior接口,呱呱叫实现 QuackBehavior接口。
总结一哈: