一、问题:
为了复用而使用继承可以看出并不好,因为模型鸟是不能飞的
image.png
二、解决:
解决方法一:子类覆盖父类,问题一旦子类一多,每个子类都得去重写,这可是体力活了。
image.png解决方法二:利用接口,将fly()放在接口里,但是这样每一种会飞的鸟都得去实现这个接口,造成代码无法复用。
三、使用策略模式
设计原则一:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
假设Bird类中fly和quack会随着鸟的不同改变,所以根据设计原则一,我们可以把这两个方法从Bird中取出来,并且分开设计建立一组新的类来代表每个行为。例如定义FlyWithWings,FlyNoWay,Quack,MuteQuack,Squeak(会飞,不会飞,不同叫声的类等等,注意是一组)
image.png设计原则二:针对接口编程,而不是针对实现编程。
有了原则一之后,Bird父类的可以这样写
void performFly(FlyNoWay f) {
f.fly();
}
这样ModelBird就可以调用这个方法performFly(new FlyNoWay()),那么解决模型鸟不会飞,但是现在突然想知道真鸟的飞行情况,Bird类就得重载一个针对会飞的鸟的方法,这样原来的方法就无法复用,因为你在原来的方法里写死了只能是FlyNoWay或者修改原来的performFly()方法,还有曾经所有调用过performFly()方法的也需要进行相应的修改,可见这种设计维护起来也很差劲。所以这时候就出现针对接口编程
image.png
设计原则三:多用组合,少用继承
组合是一种has-a的关系,就是一个类中有另一个类的引用,通过这个引用可以动态改变行为
image.png
四、实现
image.pngimage.png
image.png
网友评论