使用多态的方式替换if/switch

使用多态的方式替换if/else的方式

先假定一个场景,菜市场有卖水果的,有西瓜,苹果,香蕉等等其他很多类型的水果。客户的要求是随便取一个类型的水果,判断是否需要用到水果刀切开。如果拿到的水果是需要刀的,客户就去买水果刀。(假设这里只取三种水果进行处理)都是伪代码,只是为了说一个结论。

先上第一版代码面向过程的方式,创建三个类,Apple , BananaWatermelon.(因为这三个类没有什么字段或者方法我就先省略了)

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值