色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

jf_ro2CN3Fa ? 來(lái)源:CSDN ? 2023-09-07 11:07 ? 次閱讀

需求

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

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

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

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

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

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

購(gòu)物券 —— 購(gòu)物券表

QQ會(huì)員

外賣(mài)會(huì)員

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

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

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

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

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

策略模式

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

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

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

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

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

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

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

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

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

Map+函數(shù)式接口

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

判斷條件放在key中

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

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

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

上代碼:

@Service
publicclassQueryGrantTypeService{

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

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

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

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

//具體的邏輯操作

@Service
publicclassGrantTypeSerive{

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

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

用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ì)讓他自己百度去

最后捋一捋本文講了什么

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

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






審核編輯:劉清

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

    關(guān)注

    45

    文章

    3639

    瀏覽量

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

    關(guān)注

    7

    文章

    3795

    瀏覽量

    64364

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言中if語(yǔ)句、if-else語(yǔ)句和switch語(yǔ)句詳解

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

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

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

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

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

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

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

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

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

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

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

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

    像Arduino里的MAP函數(shù),應(yīng)用在STM32單片機(jī)上。簡(jiǎn)介:如果大家玩過(guò)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”功能

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

    解鎖新姿勢(shì):干掉過(guò)多的if-else

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

    什么是SystemVerilog-決策語(yǔ)句-if-else語(yǔ)句?

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

    如何通過(guò)策略模式簡(jiǎn)化if-else

    相信大家日常開(kāi)發(fā)中會(huì)經(jīng)常寫(xiě)各種分支判斷語(yǔ)句,比如 if-else ,當(dāng)分支較多時(shí),代碼看著會(huì)比較臃腫,那么如何優(yōu)化呢? 1、什么是策略模式? Define a family
    的頭像 發(fā)表于 10-08 16:08 ?760次閱讀
    如何通過(guò)策略模式簡(jiǎn)化<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 ?449次閱讀
    動(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è)篇章來(lái)為大家介紹: (應(yīng)用篇一)(1)函數(shù)接口的來(lái)源,(2)Lamb
    的頭像 發(fā)表于 10-13 11:32 ?631次閱讀
    <b class='flag-5'>函數(shù)</b><b class='flag-5'>式</b><b class='flag-5'>接口</b>的應(yīng)用知識(shí)點(diǎn)

    什么是函數(shù)接口

    Lambda表達(dá)式,相信大家都耳有所聞,而且不少小伙伴在日常的工作中也在使用。但說(shuō)到函數(shù)接口,可能有一些即使會(huì)使用Lambda表達(dá)式的小伙伴也會(huì)覺(jué)得陌生。今天,指北君就將帶領(lǐng)大家對(duì)Lambda
    的頭像 發(fā)表于 10-13 14:48 ?1514次閱讀
    什么是<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嵌套過(guò)多也會(huì)導(dǎo)致速度變慢;if語(yǔ)句結(jié)構(gòu)較慢,但占用面積小。 嵌套的if語(yǔ)句如果使用不當(dāng),就會(huì)
    的頭像 發(fā)表于 11-29 15:10 ?3172次閱讀
    主站蜘蛛池模板: 国产亚洲精品福利视频| 夜色福利院在线观看免费| 日本高清免费一本视频在线观看| 久久www成人看片| 好吊射视频988gaocom| 国产日韩欧美三级| 国产精品美女久久久网站动漫 | 快穿之H啪肉| 激情A片久久久久久久| 国产人妻人伦精品熟女麻豆| 国产成人v视频在线观看| 俄罗斯freeⅹ性欧美| 风情韵味人妻HD| 国产成人综合在线观看| 丰满女友bd高清在线观看| 纯h超级大尺度小黄文| 成人无码国产AV免费看直播| 处初女处夜情视频在线播放| 成人小视频在线观看| 成人在线免费| 国产精品白浆精子流水合集| 国产精品久久久久久久久久影院| 国产精品96久久久久久AV不卡| 国产高清视频a在线大全| 国产精品一区二区三区免费 | 玉林天天论坛| 5g在视影讯天天5g免费观看| 69式国产真人免费视频| 99热6精品视频6| 俄罗斯bbbb| 黄色亚洲片| 老师你下面好紧夹死了| 欧美精品华人在线| 呻吟翘臀后进爆白浆| 武侠古典久久亚洲精品| 亚洲中字幕永久在线观看| 最近2018年手机中文字幕| jizz破处| 国产亚洲精品AAAAAAA片| 永久精品视频无码一区 | 精品一区二区三区免费毛片|