成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Map+函數式接口方法 優雅的解決 if-else

開發 前端
如果 if-else的判斷情況很多,那么對應的具體策略實現類也會很多,上邊的具體的策略實現類還只是2個,查詢紅包發放方式寫在類RedPaper里邊,購物券寫在另一個類Shopping里邊;那資源類型多個QQ會員和外賣會員,不就得再多寫兩個類?

?大家好,我是不才陳某~

最近寫了一個服務:根據優惠券的類型resourceType?和編碼resourceId來 查詢 發放方式grantType和領取規則

實現方式:

  • 根據優惠券類型resourceType -> 確定查詢哪個數據表
  • 根據編碼resourceId -> 到對應的數據表里邊查詢優惠券的派發方式grantType和領取規則

優惠券有多種類型,分別對應了不同的數據庫表:

  • 紅包 —— 紅包發放規則表
  • 購物券 —— 購物券表
  • QQ會員
  • 外賣會員

實際的優惠券遠不止這些,這個需求是要我們寫一個業務分派的邏輯。

第一個能想到的思路就是if-else或者switch case:

switch(resourceType){
case "紅包":
查詢紅包的派發方式
break;
case "購物券":
查詢購物券的派發方式
break;
case "QQ會員" :
break;
case "外賣會員" :
break;
......
default : logger.info("查找不到該優惠券類型resourceType以及對應的派發方式");
break;
}

如果要這么寫的話, 一個方法的代碼可就太長了,影響了可讀性。(別看著上面case里面只有一句話,但實際情況是有很多行的)。

而且由于 整個 if-else的代碼有很多行,也不方便修改,可維護性低。

策略模式

策略模式是把 if語句里面的邏輯抽出來寫成一個類,如果要修改某個邏輯的話,僅修改一個具體的實現類的邏輯即可,可維護性會好不少。

圖片

策略模式

策略模式在業務邏輯分派的時候還是if-else ,只是說比第一種思路的if-else 更好維護一點。

switch(resourceType){
case "紅包":
String grantType=new Context(new RedPaper()).ContextInterface();
break;
case "購物券":
String grantType=new Context(new Shopping()).ContextInterface();
break;

......
default : logger.info("查找不到該優惠券類型resourceType以及對應的派發方式");
break;

但缺點也明顯:

  • 如果 if-else的判斷情況很多,那么對應的具體策略實現類也會很多,上邊的具體的策略實現類還只是2個,查詢紅包發放方式寫在類RedPaper里邊,購物券寫在另一個類Shopping里邊;那資源類型多個QQ會員和外賣會員,不就得再多寫兩個類?有點麻煩了。
  • 沒法俯視整個分派的業務邏輯

Map+函數式接口

用上了Java8的新特性lambda表達式:

  • 判斷條件放在key中
  • 對應的業務邏輯放在value中

這樣子寫的好處是非常直觀,能直接看到判斷條件對應的業務邏輯。

需求:根據優惠券(資源)類型 resourceType 和編碼 resourceId 查詢派發方式grantType。

上代碼:

@Service
public class QueryGrantTypeService {

@Autowired
private GrantTypeSerive grantTypeSerive;
private Map<String, Function<String,String>> grantTypeMap=new HashMap<>();

/**
* 初始化業務分派邏輯,代替了if-else部分
* key: 優惠券類型
* value: lambda表達式,最終會獲得該優惠券的發放方式
*/
@PostConstruct
public void dispatcherInit(){
grantTypeMap.put("紅包",resourceId->grantTypeSerive.redPaper(resourceId));
grantTypeMap.put("購物券",resourceId->grantTypeSerive.shopping(resourceId));
grantTypeMap.put("qq會員",resourceId->grantTypeSerive.QQVip(resourceId));
}

public String getResult(String resourceType){
//Controller根據 優惠券類型resourceType、編碼resourceId 去查詢 發放方式grantType
Function<String,String> result=getGrantTypeMap.get(resourceType);
if(result!=null){
//傳入resourceId 執行這段表達式獲得String型的grantType
return result.apply(resourceId);
}
return "查詢不到該優惠券的發放方式";
}
}

如果單個 if 語句塊的業務邏輯有很多行的話,我們可以把這些 業務操作抽出來,寫成一個單獨的Service,即:

//具體的邏輯操作

@Service
public class GrantTypeSerive {

public String redPaper(String resourceId){
//紅包的發放方式
return "每周末9點發放";
}
public String shopping(String resourceId){
//購物券的發放方式
return "每周三9點發放";
}
public String QQVip(String resourceId){
//qq會員的發放方式
return "每周一0點開始秒殺";
}
}

入參 String resourceId是用來查數據庫的,這里簡化了,傳參之后不做處理。

用http調用的結果:

@RestController
public class GrantTypeController {

@Autowired
private QueryGrantTypeService queryGrantTypeService;

@PostMapping("/grantType")
public String test(String resourceName){
return queryGrantTypeService.getResult(resourceName);
}
}

圖片

http調用的結果

用Map+函數式接口也有弊端:

你的隊友得會lambda表達式才行啊,當然他不會的讓他自己百度去!

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2023-06-02 07:30:24

If-else結構流程控制

2013-03-06 10:28:57

ifJava

2024-11-04 09:41:47

2021-03-10 07:20:43

if-else靜態代碼

2021-04-13 06:39:13

代碼重構code

2022-01-13 10:45:59

if-else代碼Java

2021-11-04 08:53:00

if-else代碼Java

2022-07-11 08:16:55

策略模式if-else

2020-10-22 09:20:22

SQLNoSQL 數據庫

2020-04-09 08:29:50

編程語言事件驅動

2025-04-24 08:40:00

JavaScript代碼return語句

2020-12-15 09:31:58

CTOif-else代碼

2020-05-13 14:15:25

if-else代碼前端

2024-06-18 18:36:03

2020-09-27 14:24:58

if-else cod業務

2021-01-29 07:45:27

if-else代碼數據

2024-04-26 08:58:54

if-else代碼JavaSpring

2023-11-14 08:00:00

Angular前端開發

2025-06-26 01:10:00

服務定位解析器Spring

2024-10-17 09:21:30

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩在线看 | 日韩av在线免费 | 精品国产乱码久久久久久牛牛 | 日韩视频在线一区 | 日韩精品一区二区三区第95 | 亚洲男人天堂av | 欧美亚洲国产一区二区三区 | 亚洲另类视频 | 国产在线观看一区二区三区 | 亚洲高清视频一区二区 | 永久网站 | 亚洲一区二区三区免费在线 | 日本一二区视频 | 羞羞色影院 | 麻豆国产一区二区三区四区 | 午夜国产精品视频 | 中文字幕久久精品 | 狠狠操电影 | 国产精品小视频在线观看 | 国产成人免费视频网站高清观看视频 | 久久99精品久久久久久 | 国产免费观看久久黄av片涩av | 精品视频在线播放 | 日韩在线成人 | 中国一级特黄真人毛片免费观看 | 一区二区国产精品 | 欧美一级做性受免费大片免费 | 台湾佬久久 | 精品无码三级在线观看视频 | 国产精品视频免费看 | 欧美九九九 | 日日夜夜精品免费视频 | 久久av一区二区三区 | 精品一区二区电影 | 成人精品区 | 中文字幕日韩欧美一区二区三区 | 久久精品视频网站 | 亚洲综合大片69999 | 青娱乐一区二区 | 国产小视频在线观看 | 精品一区二区三区免费毛片 |