項目開發過程中,有時經常需要根據不同的條件做不同的事情,於是
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
,不太雅觀,小夥伴可通過枚舉映射一下,本文不再講述
- 改造後,
- 本文完,希望對你有幫助