使用多态的方式替换if/else的方式
先假定一个场景,菜市场有卖水果的,有西瓜,苹果,香蕉等等其他很多类型的水果。客户的要求是随便取一个类型的水果,判断是否需要用到水果刀切开。如果拿到的水果是需要刀的,客户就去买水果刀。(假设这里只取三种水果进行处理)都是伪代码,只是为了说一个结论。
先上第一版代码面向过程的方式,创建三个类,Apple
, Banana
,Watermelon
.(因为这三个类没有什么字段或者方法我就先省略了)
public boolean isNeedKnife(Object param) {
if (param is Apple) {
return false;
} else if (param is Banana ) {
return false;
} else if (param is Watermelon) {
return true;
}
}
这种方式的代码在很多开发中经常使用,写一个方法判断是否需要水果刀,或者就是
switch
的方式。换汤不换药。如果新加一个水果,这里免不了改动。比如我新加一个火龙果,又要加else if
我们第二版改成面向对象的方式去重构这块的代码,新建一个水果类Fruits
, 其他的水果子类去继承Fruits
。
public abstract class Fruits {
public boolean isNeedKnife() {
return false;
}
}
在父类定义一个方法去判断是否需要水果刀的方法。(默认返回false,认为很多水果都不需要水果刀。)
子类苹果Apple
不用刀,继承了水果类也可以直接调用父类的方法,并且返回值也是false
。如果客户说非要用刀才能吃苹果,那就重写是否需要刀的方法。但是西瓜类Watermelon
需要用到水果刀,所以在西瓜类这个子类中重写isNeedKnife
方法。
public class Watermelon extends Fruits{
@Override
public boolean isNeedKnife() {
return true;
}
}
在业务处理中,实际持有的是Fruits
父类这个引用。假设有一个Shop
类,它应该有的属性应该是Fruits
。这样的设计思想
我是商店 我有水果 水果可能是西瓜,苹果,香蕉,可能是未来火星种的,您不用管,客户说有那咱就有,后续扩展的话就是继承,重写方法。
如果在Shop
类声明apple, banana,watermelon
这样理解就是
我是商店,我有苹果,有香蕉,西瓜,至于其他水果,你不写,那咱就肯定没有,后续如果不卖苹果,那就删了苹果相关的业务,连带着测试。
在业务处理调用的时候,直接用shop.fruits.isNeedKnife()就可以,实际会分发到各个子类上的isNeedKnife方法上,如果你想加一个橙子,直接继承父类,重写里面的方法就可以,其他所有地方都不用改变。
理解面向对象的思想,少写if else