if-else的优化方式(枚举/策略模式)

0 . 目的

代码中常常可能会充斥大量的if-else,造成代码可读性差,维护困难,扩展性差。
通过优化可以减少大量的if-else存在的情况。

1 . 枚举

枚举中可以定义抽象方法,从而实现根据不同的入参选择不同的执行代码。

  1. 定义枚举内容
public enum Action {
	//定义枚举类型
    EAT {
        @Override
        void run() {
			Log.d("TAG", "eat!");
        }
    },
    DRINK {
        @Override
        void run() {
            Log.d("TAG", "sleep!");
        }
    };
	//抽象方法,在枚举类型中实现。
    abstract void run();
}
  1. 调用
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Action.valueOf("EAT").run();	//调用方式
    }
}

2 . 策略模式 (Strategy Pattern)

策略模式也可以实现减少if-else的需求

策略模式(Strategy Pattern),指的是定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化。

策略模式只适用管理一组同类型的算法,并且这些算法是完全互斥的情况。也就是说任何时候,多个策略中只有一个可以生效的那一种。

策略模式共由三部分组成:

  • 抽象策略类
    将需要用到的算法提成一个接口,用来定义算法。具体算法实现由具体策略类去实现。
  • 具体策略类
    根据不同策略内容,创建具体策略类,实现抽象策略类中的算法。
  • 上下文
    集成算法类。将具体策略类和需要调用的方法集成进来。实现最终仅需通过该类调用方法即可。

一个根据不同用户等级给予不同折扣的Demo:

  1. 抽象策略类
    是一个接口,里面定义了需实现的算法。
public interface Buyer {
    BigDecimal calPrice(BigDecimal order);
}
  1. 具体策略类
    根据需求创建具体策略类,实现抽象策略类的接口。
//普通用户
public class NormalBuyer implements Buyer {
    @Override
    public BigDecimal calPrice(BigDecimal order) {
        return order.multiply(new BigDecimal(0.9));	//九折
    }
}
//VIP用户
public class VipBuyer implements Buyer {
    @Override
    public BigDecimal calPrice(BigDecimal order) {
        return order.multiply(new BigDecimal(0.8));	//八折
    }
}
//超级VIP用户
public class SuperVipBuyer implements Buyer {
    @Override
    public BigDecimal calPrice(BigDecimal order) {
        return order.multiply(new BigDecimal(0.7));	//七折
    }
}
  1. 上下文类
    上下文类传入具体策略类,并对外提供调用方法。
public class Cashier {
    private Buyer buyer;
    public Cashier(Buyer buyer) {
        this.buyer = buyer;
    }
    public BigDecimal quote(BigDecimal price) {
        return this.buyer.calPrice(price);
    }
}
  1. 使用
int orderPrice = 100;
Cashier superVipCashier = new Cashier(new SuperVipBuyer());
BigDecimal superVipQuote = superVipCashier.quote(orderPrice);  
Log.d(TAG, "price: "+superVipQuote);	//price: 70

3 . 其他方式

还有其他的方式可以减少if-else的存在。如表驱动或卫语句。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值