在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Map+函數(shù)式接口如何完美的解決if-else問題?

jf_ro2CN3Fa ? 來源:CSDN ? 2023-09-07 11:07 ? 次閱讀

需求

最近寫了一個(gè)服務(wù):根據(jù)優(yōu)惠券的類型resourceType和編碼resourceId來 查詢 發(fā)放方式grantType和領(lǐng)取規(guī)則

實(shí)現(xiàn)方式:

根據(jù)優(yōu)惠券類型resourceType -> 確定查詢哪個(gè)數(shù)據(jù)表

根據(jù)編碼resourceId -> 到對(duì)應(yīng)的數(shù)據(jù)表里邊查詢優(yōu)惠券的派發(fā)方式grantType和領(lǐng)取規(guī)則

優(yōu)惠券有多種類型,分別對(duì)應(yīng)了不同的數(shù)據(jù)庫表:

紅包 —— 紅包發(fā)放規(guī)則表

購物券 —— 購物券表

QQ會(huì)員

外賣會(huì)員

實(shí)際的優(yōu)惠券遠(yuǎn)不止這些,這個(gè)需求是要我們寫一個(gè)業(yè)務(wù)分派的邏輯

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

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

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

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

策略模式

策略模式是把 if語句里面的邏輯抽出來寫成一個(gè)類,如果要修改某個(gè)邏輯的話,僅修改一個(gè)具體的實(shí)現(xiàn)類的邏輯即可,可維護(hù)性會(huì)好不少。

以下是策略模式的具體結(jié)構(gòu)

9fe00f06-4d1e-11ee-a25d-92fbcf53809c.png

策略模式在業(yè)務(wù)邏輯分派的時(shí)候還是if-else,只是說比第一種思路的if-else 更好維護(hù)一點(diǎn)。

switch(resourceType){
case"紅包":
StringgrantType=newContext(newRedPaper()).ContextInterface();
break;
case"購物券":
StringgrantType=newContext(newShopping()).ContextInterface();
break;

......
default:logger.info("查找不到該優(yōu)惠券類型resourceType以及對(duì)應(yīng)的派發(fā)方式");
break;

但缺點(diǎn)也明顯:

如果 if-else的判斷情況很多,那么對(duì)應(yīng)的具體策略實(shí)現(xiàn)類也會(huì)很多,上邊的具體的策略實(shí)現(xiàn)類還只是2個(gè),查詢紅包發(fā)放方式寫在類RedPaper里邊,購物券寫在另一個(gè)類Shopping里邊;那資源類型多個(gè)QQ會(huì)員和外賣會(huì)員,不就得再多寫兩個(gè)類?有點(diǎn)麻煩了

沒法俯視整個(gè)分派的業(yè)務(wù)邏輯

Map+函數(shù)式接口

用上了Java8的新特性lambda表達(dá)式

判斷條件放在key中

對(duì)應(yīng)的業(yè)務(wù)邏輯放在value中

這樣子寫的好處是非常直觀,能直接看到判斷條件對(duì)應(yīng)的業(yè)務(wù)邏輯

需求:根據(jù)優(yōu)惠券(資源)類型resourceType和編碼resourceId查詢派發(fā)方式grantType

上代碼:

@Service
publicclassQueryGrantTypeService{

@Autowired
privateGrantTypeSerivegrantTypeSerive;
privateMap>grantTypeMap=newHashMap<>();

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

publicStringgetResult(StringresourceType){
//Controller根據(jù)優(yōu)惠券類型resourceType、編碼resourceId去查詢發(fā)放方式grantType
Functionresult=getGrantTypeMap.get(resourceType);
if(result!=null){
//傳入resourceId執(zhí)行這段表達(dá)式獲得String型的grantType
returnresult.apply(resourceId);
}
return"查詢不到該優(yōu)惠券的發(fā)放方式";
}
}

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

//具體的邏輯操作

@Service
publicclassGrantTypeSerive{

publicStringredPaper(StringresourceId){
//紅包的發(fā)放方式
return"每周末9點(diǎn)發(fā)放";
}
publicStringshopping(StringresourceId){
//購物券的發(fā)放方式
return"每周三9點(diǎn)發(fā)放";
}
publicStringQQVip(StringresourceId){
//qq會(huì)員的發(fā)放方式
return"每周一0點(diǎn)開始秒殺";
}
}

入?yún)tring resourceId是用來查數(shù)據(jù)庫的,這里簡化了,傳參之后不做處理。

用http調(diào)用的結(jié)果:

@RestController
publicclassGrantTypeController{

@Autowired
privateQueryGrantTypeServicequeryGrantTypeService;

@PostMapping("/grantType")
publicStringtest(StringresourceName){
returnqueryGrantTypeService.getResult(resourceName);
}
}
a010c98e-4d1e-11ee-a25d-92fbcf53809c.png

用Map+函數(shù)式接口也有弊端:

你的隊(duì)友得會(huì)lambda表達(dá)式才行啊,他不會(huì)讓他自己百度去

最后捋一捋本文講了什么

策略模式通過接口、實(shí)現(xiàn)類、邏輯分派來完成,把 if語句塊的邏輯抽出來寫成一個(gè)類,更好維護(hù)。

Map+函數(shù)式接口通過Map.get(key)來代替 if-else的業(yè)務(wù)分派,能夠避免策略模式帶來的類增多、難以俯視整個(gè)業(yè)務(wù)邏輯的問題。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編碼器
    +關(guān)注

    關(guān)注

    45

    文章

    3650

    瀏覽量

    134762
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3826

    瀏覽量

    64509

原文標(biāo)題:Map+函數(shù)式接口,“更完美” 的解決 if-else的問題

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語言中if語句、if-else語句和switch語句詳解

    在C語言中,有三種條件判斷結(jié)構(gòu):if語句、if-else語句和switch語句。
    發(fā)表于 08-18 16:36 ?1.2w次閱讀
    C語言中if語句、<b class='flag-5'>if-else</b>語句和switch語句詳解

    煉獄傳奇-if_else與case之戰(zhàn)

    Verilog HDL語言中存在兩種分支語言:● if-else 條件分支語句● case 分支控制語句1. if-else條件分支語句if-else 條件分支語句的作用是根據(jù)指定的判斷條件是否滿足
    發(fā)表于 03-31 09:51

    Proteus之if-else語句的應(yīng)用

    Proteus之if-else語句的應(yīng)用,很好的Proteus資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-18 14:49 ?0次下載

    FPGA學(xué)習(xí)系列:if-else與case

    設(shè)計(jì)背景:不管是在什么軟件和硬件語言,我們?cè)谖覀兊拇a中都或多或少的用到這兩條語句,if..else與case語句,今天我們將學(xué)習(xí)verilog中的這兩條語句,其實(shí)不管在什么語言中這兩個(gè)語句都是一樣
    的頭像 發(fā)表于 06-01 16:59 ?1.2w次閱讀
    FPGA學(xué)習(xí)系列:<b class='flag-5'>if-else</b>與case

    從入門到高級(jí)替換If-Else的5種方法示例

    本文并不肯定或者否定哪一種寫法,僅僅為大家提供一些其他的編碼思路或者一些值得借鑒的點(diǎn)子。 設(shè)計(jì)更好的軟件,替換 If-Else 的 5 種方法,從入門到高級(jí)示例 If-Else 通常是一個(gè)糟糕的選擇
    的頭像 發(fā)表于 02-20 16:27 ?6849次閱讀
    從入門到高級(jí)替換<b class='flag-5'>If-Else</b>的5種方法示例

    不會(huì)有人不知道怎么優(yōu)雅的替換if-else語句吧

    來自:love1024.blog.csdn.net/article/details/104955363 場景日常開發(fā),if-else語句寫的不少吧??當(dāng)邏輯分支非常多的時(shí)候,if-else套了一層
    的頭像 發(fā)表于 07-28 15:46 ?1445次閱讀
    不會(huì)有人不知道怎么優(yōu)雅的替換<b class='flag-5'>if-else</b>語句吧

    像Arduino里的MAP函數(shù),應(yīng)用在STM32單片機(jī)上。

    像Arduino里的MAP函數(shù),應(yīng)用在STM32單片機(jī)上。簡介:如果大家玩過Arduino,想必知道MAP();函數(shù)了,這是一個(gè)很好用的映射函數(shù)
    發(fā)表于 12-24 19:29 ?0次下載
    像Arduino里的<b class='flag-5'>MAP</b><b class='flag-5'>函數(shù)</b>,應(yīng)用在STM32單片機(jī)上。

    關(guān)于Python中的“for-else”功能

    無論使用哪種編程語言,我們都會(huì)編寫“if-else”語句,但是“for-else”呢?
    發(fā)表于 09-26 14:44 ?554次閱讀

    解鎖新姿勢:干掉過多的if-else

    這點(diǎn)非常容易理解,就是說在業(yè)務(wù)邏輯里面,先把不符合條件的給先過濾掉,而不是層層嵌套if-else判斷
    的頭像 發(fā)表于 11-12 10:01 ?666次閱讀

    什么是SystemVerilog-決策語句-if-else語句?

    決策語句(Decision statements)允許程序塊的執(zhí)行流程根據(jù)設(shè)計(jì)中信號(hào)的當(dāng)前值分支到特定語句。SystemVerilog有兩個(gè)主要的決策語句:if…else語句和case語句,使用關(guān)鍵字case、case…inside,casex和casez。
    的頭像 發(fā)表于 02-09 14:15 ?1200次閱讀
    什么是SystemVerilog-決策語句-<b class='flag-5'>if-else</b>語句?

    如何通過策略模式簡化if-else

    相信大家日常開發(fā)中會(huì)經(jīng)常寫各種分支判斷語句,比如 if-else ,當(dāng)分支較多時(shí),代碼看著會(huì)比較臃腫,那么如何優(yōu)化呢? 1、什么是策略模式? Define a family
    的頭像 發(fā)表于 10-08 16:08 ?784次閱讀
    如何通過策略模式簡化<b class='flag-5'>if-else</b>

    動(dòng)態(tài)函數(shù)接口的調(diào)用原理

    本篇將從編譯,執(zhí)行層面為大家講解函數(shù)接口運(yùn)行的機(jī)制,讓各位小伙伴更進(jìn)一步加深對(duì)函數(shù)接口的理解
    的頭像 發(fā)表于 10-13 11:27 ?466次閱讀
    動(dòng)態(tài)<b class='flag-5'>函數(shù)</b><b class='flag-5'>接口</b>的調(diào)用原理

    函數(shù)接口的應(yīng)用知識(shí)點(diǎn)

    概述 函數(shù)接口將分為三個(gè)篇章來為大家介紹: (應(yīng)用篇一)(1)函數(shù)接口的來源,(2)Lamb
    的頭像 發(fā)表于 10-13 11:32 ?648次閱讀
    <b class='flag-5'>函數(shù)</b><b class='flag-5'>式</b><b class='flag-5'>接口</b>的應(yīng)用知識(shí)點(diǎn)

    什么是函數(shù)接口

    Lambda表達(dá)式,相信大家都耳有所聞,而且不少小伙伴在日常的工作中也在使用。但說到函數(shù)接口,可能有一些即使會(huì)使用Lambda表達(dá)式的小伙伴也會(huì)覺得陌生。今天,指北君就將帶領(lǐng)大家對(duì)Lambda
    的頭像 發(fā)表于 10-13 14:48 ?1552次閱讀
    什么是<b class='flag-5'>函數(shù)</b><b class='flag-5'>式</b><b class='flag-5'>接口</b>

    Verilog代碼:if-else和case的電路結(jié)構(gòu)和區(qū)別

    每個(gè)if-else就是一個(gè)2選1mux器。當(dāng)信號(hào)有明顯優(yōu)先級(jí)時(shí),首先要考慮if-else,但是if嵌套過多也會(huì)導(dǎo)致速度變慢;if語句結(jié)構(gòu)較慢,但占用面積小。 嵌套的if語句如果使用不當(dāng),就會(huì)
    的頭像 發(fā)表于 11-29 15:10 ?3405次閱讀
    主站蜘蛛池模板: 日韩精品系列产品| 欧美日韩色图| 伊人久久大香线蕉综合亚洲| 老师你好大好白好紧好硬| 天天翘夜夜洗澡天天做| 精品国产成人三级在线观看| 高h水果榨汁play男男| 亚洲乱码中文字幕综合| 我想看一级黄色片| 色在线视频播放| 欧美xxxxxbbbb| 国模吧在线视频| 在线视频 亚洲| 视频在线观看免费| 国产成人福利夜色影视| 91免费在线视频| 中日韩毛片| 色多多拼多多网站| 久久青青草原精品老司机| 国产3p在线播放| 天天碰天天| 人色网| 九九热在线免费视频| 婷婷激情综合网| 麻豆美女大尺度啪啪| 中文字幕自拍| 国产美女视频黄a视频全免费网站| xxxxx日本69| 伊人久久大香线蕉观看| 欧美午夜视频在线| 成年人电影黄色| 精品乱码一区二区三区四区| 在线观看一区二区三区视频| 一卡二卡三卡四卡无卡在线 | 免费一级毛片在线播放| 免费被视频网站在线观看| 伊人久久大香线蕉综合网站| 欧美一级欧美三级| 午夜在线视频国产| 国产高清免费不卡观看| 国产亚洲自在精品久久|