if-else?解決方案①策略模式 ②Map+Function函數(shù)式接口
1.策略模式解決if-else
策略模式是把 if語句里面的邏輯抽出來寫成一個(gè)類灵妨,如果要修改某個(gè)邏輯的話穗熬,
僅修改一個(gè)具體的實(shí)現(xiàn)類的邏輯即可,實(shí)現(xiàn)可維護(hù)性同時(shí)增加可擴(kuò)展性,問題就是:會增加很多冗余的類
示例代碼如下:
/**
* @author lisanwei
*/
public abstract class Business {
/**
* 定義父類實(shí)現(xiàn)功能共有方法
*
* @param dataSyncRecordVo 參數(shù)
* @return 結(jié)果集
*/
abstract Object queryData(DataSyncRecordVo dataSyncRecordVo);
}
/**
* 可以獨(dú)使用一個(gè)類
*/
class Context {
/**
* 公共接口的引用臼勉,通過多態(tài)實(shí)現(xiàn)擴(kuò)展調(diào)用
*/
Business business;
public Context(Business business) {
this.business = business;
}
/**
* 執(zhí)行調(diào)用的方法
*
* @param dataSyncRecordVo 參數(shù)
* @return 結(jié)果集
*/
public Object contextInstance(DataSyncRecordVo dataSyncRecordVo) {
return business.queryData(dataSyncRecordVo);
}
}
兩個(gè)業(yè)務(wù)實(shí)現(xiàn)類:
public class BusinessQueryDetail extends Business {
@Override
Object queryData(DataSyncRecordVo dataSyncRecordVo) {
return "僅僅做例子參考";
}
}
public class BusinessQueryUser extends Business{
@Override
Object queryData(DataSyncRecordVo dataSyncRecordVo) {
return "僅僅做例子參考";
}
}
2.Map+Function函數(shù)式接口解決if-else
/**
* @author lisanwei
*/
@Service
public class BusinessTypeService {
@Resource
private BusinessService businessService;
/**
* 引入函數(shù)式接口
*/
private final Map<String, Function<DataSyncRecordVo, Object>> businessTypeMap = new HashMap<>();
/**
* 初始化業(yè)務(wù)分派邏輯,代替了if-else部分
* key: 判定執(zhí)行業(yè)務(wù)名稱
* value: lambda表達(dá)式,最終會執(zhí)行的業(yè)務(wù)類型
*/
@PostConstruct
public void dispatcherInit() {
final Function<DataSyncRecordVo, Object>
userInfo = businessTypeMap.put("用戶信息", (dataSyncRecordVo) -> businessService.dealerContract(dataSyncRecordVo));
final Function<DataSyncRecordVo, Object>
userDetail = businessTypeMap.put("用戶詳情", (dataSyncRecordVo) -> businessService.dealerDecoration(dataSyncRecordVo));
}
/**
* 調(diào)用方使用
*
* @param businessName 業(yè)務(wù)名稱
* @param dataSyncRecordVo 對象參數(shù)數(shù)據(jù)
* @return 結(jié)果集
*/
public Object getResult(String businessName, DataSyncRecordVo dataSyncRecordVo) {
/* 傳入businessName業(yè)務(wù)名稱和參數(shù)即可動(dòng)態(tài)獲取*/
Function<DataSyncRecordVo, Object> result = businessTypeMap.get(businessName);
if (result != null) {
return result.apply(dataSyncRecordVo);
}
return "=== 無法獲取用戶信息 ===";
}
}
業(yè)務(wù)執(zhí)行類
/**
* 業(yè)務(wù)Service
*
* @author lisanwei
*/
@Service
public class BusinessService {
/**
* 獲取用戶信息
*
* @param syncRecordVo 對象
*/
public Object dealerContract(DataSyncRecordVo syncRecordVo) {
return userMapper.selectUserById(syncRecordVo.getId());
}
/**
* 獲取用戶詳情
*
* @param syncRecordVo 參數(shù)
*/
public Object dealerDecoration(DataSyncRecordVo syncRecordVo) {
return userMapper.selectUserDetailById(syncRecordVo.getId());
}
}
最簡單的if-else代碼冗余判斷,代碼比較堆疊餐弱,同時(shí)代碼篇幅大宴霸,且不是很方便修改和維護(hù)代碼囱晴,好處是代碼比較易懂,策略模式通過接口瓢谢、實(shí)現(xiàn)類畸写、邏輯分派來完成,把 if語句塊的邏輯抽出來寫成一個(gè)類氓扛,更好維護(hù)枯芬,但是會產(chǎn)生更多的實(shí)現(xiàn)類,而Map+Function函數(shù)式接口通過Map.get(key)來代替 if-else的業(yè)務(wù)判斷執(zhí)行采郎,能夠避免策略模式帶來的類增多破停、難以很清晰的了解業(yè)務(wù)問題,當(dāng)然還有很多好的處理方式:比如通過Enum枚舉的方式實(shí)現(xiàn)if-else的判斷等尉剩,歡迎評論區(qū)留言