0 . 目的
代码中常常可能会充斥大量的if-else,造成代码可读性差,维护困难,扩展性差。
通过优化可以减少大量的if-else存在的情况。
1 . 枚举
枚举中可以定义抽象方法,从而实现根据不同的入参选择不同的执行代码。
- 定义枚举内容
public enum Action {
//定义枚举类型
EAT {
@Override
void run() {
Log.d("TAG", "eat!");
}
},
DRINK {
@Override
void run() {
Log.d("TAG", "sleep!");
}
};
//抽象方法,在枚举类型中实现。
abstract void run();
}
- 调用
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:
- 抽象策略类
是一个接口,里面定义了需实现的算法。
public interface Buyer {
BigDecimal calPrice(BigDecimal order);
}
- 具体策略类
根据需求创建具体策略类,实现抽象策略类的接口。
//普通用户
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)); //七折
}
}
- 上下文类
上下文类传入具体策略类,并对外提供调用方法。
public class Cashier {
private Buyer buyer;
public Cashier(Buyer buyer) {
this.buyer = buyer;
}
public BigDecimal quote(BigDecimal price) {
return this.buyer.calPrice(price);
}
}
- 使用
int orderPrice = 100;
Cashier superVipCashier = new Cashier(new SuperVipBuyer());
BigDecimal superVipQuote = superVipCashier.quote(orderPrice);
Log.d(TAG, "price: "+superVipQuote); //price: 70
3 . 其他方式
还有其他的方式可以减少if-else的存在。如表驱动或卫语句。