首先说说继承带来的问题
1.父类定义的方法过少
(PS:父类中有方法A,而子类也有方法A,表示子类要重写继承自父类的方法A,子类没有方法A,则表示直接使用继承自父类的方法A)
高达A,高达B,…,高达N都有开枪操作,而且其中的实现都是一样的,但是由于父类没有这样的方法
则所有用到这些方法的子类都得重新实现一边,如果涉及到修改的话,还得修改很多个地方
2.父类定义的方法过多
(最根本的原因是因为:你无法保证父类定义的方法是否能满足以后子类的需求,未来总是不可预见的 :()
那么试试抽出枪类的接口?
从上面可以看到,即使抽象出相应的接口,还是得在高达1、高达2、…、高达n中重复地实现开枪的方法,这样还是没有解决问题
如果要修改开枪的方法,还是得在高达A,B...N上一个个地修改...囧
(PS:高达中的开枪方法只需要调用枪类接口中的子类,即手枪 或 机关枪中的开枪方法就可以了,具体的开枪实现在 手枪,机关枪类中)
但是再看看这幅图,这样就避免了代码重复实现的问题,如果哪天手枪的攻击效果统一升级了,那么只需要修改手枪这个类,那么所有用到手枪的高达都集体升级了!
从上述问题我们可以看到几个设计原则:
1.应用中可能需要变化的地方,把它们独立出来,不要和那些不需要变化的代码混在一起
上图中,机器人的类是肯定有走路、跑步的动作的,我们把这些行为当做是不太可能需要变化的部分,而枪类的攻击行为则是有的机器人有,有的没有,这些就是可能变化的部分,因此我们将可能变化的部分的实现抽离出来,这样可以避免在修改变化部分的时候,去修改已经稳定的代码
2.面向接口编程,而不是针对实现编程
这个的好处我就不再多说了
3.类应该对扩展开放,对修改封闭
意思就是良好设计的类,当需求产生变化时,只需要添加新的代码即可满足需求,而不需要修改现有的代码,这个原则和前面的可以联合在一起理解
4.多用组合,少用继承
在机器人的类中包含枪类接口的属性,这样的方式就叫做组合,具体的好处就自己看看上面的图示吧 :-)