项目开发过程中,有时经常需要根据不同的条件做不同的事情,于是
if else
代码到处都是,本文就来讲讲如何优雅干掉难缠的if else
先来看看使用 if else
的情况
- 以支付为例,代码如下
@Service
public class PayService {
/**
* 支付
*
* @param orderInfo
* @param payType
* @return
*/
public boolean pay(Object orderInfo, Integer payType) {
if (payType == 1) {
System.out.println("微信支付");
} else if (payType == 2) {
System.out.println("支付宝支付");
} else if (payType == 3) {
System.out.println("信用卡支付");
}
return true;
}
}
- 选择不同的支付方式,进行不同的支付处理,当再接入其他的支付方式,还要在代码里面增加判断,代码耦合性很高
下面对上面代码进行改造,如下
- 对支付抽象一个接口
PayManager
public interface PayManager {
/**
* 支付处理
*
* @param orderInfo
* @return
*/
boolean pay(Object orderInfo);
}
- 微信支付,支付宝支付,银行卡支付等均实现该接口,做相应的逻辑处理
// 微信支付逻辑处理类
@Component("payManager1")
public class WeixinPayManager implements PayManager {
@Override
public boolean pay(Object orderInfo) {
System.out.println("微信支付");
return false;
}
}
// 支付宝支付逻辑处理类
@Component("payManager2")
public class AliPayManager implements PayManager {
@Override
public boolean pay(Object orderInfo) {
System.out.println("支付宝支付");
return false;
}
}
// 银行卡支付逻辑处理类
@Component("payManager3")
public class BankCardPayManager implements PayManager {
@Override
public boolean pay(Object orderInfo) {
System.out.println("银行卡支付");
return false;
}
}
- 改造
PayService
类
@Service
public class PayService {
@Autowired
private Map<String, PayManager> payManagerMap;
/**
* 支付
*
* @param orderInfo
* @param payType
* @return
*/
public boolean pay(Object orderInfo, Integer payType) {
PayManager payManager = payManagerMap.get("payManager" + payType);
payManager.pay(orderInfo);
return true;
}
}
- 总结
- 改造后,
PayService
中代码逻辑清晰,没有繁琐的if else
,以后再接入一种支付方式,只需要新增一个类,并实现PapManager
接口即可,其他代码无需修改,符合“开闭原则” - 对于
PayService
通过直接注入private Map<String, PayManager> payManagerMap
,可能有些小伙伴比较陌生,其实这里Spring
会查找所有PayManager
类型的Bean
实例,并注入到这个Map里面 - 可能有的觉得,每种支付方式,都要创建一个类,会造成类越来越多,实际开发过程中,每种支付方式处理,可能涉及逻辑很多,分成不同的类处理比较,当然也可根据实际情况抽象公共的代码,本文不再讲述
- 这里直接使用
payManager1、payManager2、payManager3
,不太雅观,小伙伴可通过枚举映射一下,本文不再讲述
- 改造后,
- 本文完,希望对你有帮助