還在用策略模式解決 if-else?Map+函數(shù)式接口方法才是YYDS!
閱讀本文大概需要 3.5 分鐘。
來(lái)自:blog.csdn.net/qq_44384533/article/details/109197926
# 文章目錄
需求 策略模式 Map+函數(shù)式接口 最后捋一捋本文講了什么
# 需求
實(shí)現(xiàn)方式:
根據(jù)優(yōu)惠券類型resourceType -> 確定查詢哪個(gè)數(shù)據(jù)表
根據(jù)編碼resourceId -> 到對(duì)應(yīng)的數(shù)據(jù)表里邊查詢優(yōu)惠券的派發(fā)方式grantType和領(lǐng)取規(guī)則
紅包 —— 紅包發(fā)放規(guī)則表
購(gòu)物券 —— 購(gòu)物券表
QQ會(huì)員
外賣會(huì)員
switch(resourceType){case "紅包":查詢紅包的派發(fā)方式break;case "購(gòu)物券":查詢購(gòu)物券的派發(fā)方式break;case "QQ會(huì)員" :break;case "外賣會(huì)員" :break;......default : logger.info("查找不到該優(yōu)惠券類型resourceType以及對(duì)應(yīng)的派發(fā)方式");break;}
# 策略模式

switch(resourceType){case "紅包":String grantType=new Context(new RedPaper()).ContextInterface();break;case "購(gòu)物券":String grantType=new Context(new Shopping()).ContextInterface();break;......default : logger.info("查找不到該優(yōu)惠券類型resourceType以及對(duì)應(yīng)的派發(fā)方式");break;
如果 if-else的判斷情況很多,那么對(duì)應(yīng)的具體策略實(shí)現(xiàn)類也會(huì)很多,上邊的具體的策略實(shí)現(xiàn)類還只是2個(gè),查詢紅包發(fā)放方式寫在類RedPaper里邊,購(gòu)物券寫在另一個(gè)類Shopping里邊;那資源類型多個(gè)QQ會(huì)員和外賣會(huì)員,不就得再多寫兩個(gè)類?有點(diǎn)麻煩了
沒法俯視整個(gè)分派的業(yè)務(wù)邏輯
# Map+函數(shù)式接口
判斷條件放在key中 對(duì)應(yīng)的業(yè)務(wù)邏輯放在value中
需求:根據(jù)優(yōu)惠券(資源)類型resourceType和編碼resourceId查詢派發(fā)方式grantType
public class QueryGrantTypeService {private GrantTypeSerive grantTypeSerive;private Map<String, Function<String,String>> grantTypeMap=new HashMap<>();/*** 初始化業(yè)務(wù)分派邏輯,代替了if-else部分* key: 優(yōu)惠券類型* value: lambda表達(dá)式,最終會(huì)獲得該優(yōu)惠券的發(fā)放方式*/public void dispatcherInit(){grantTypeMap.put("紅包",resourceId->grantTypeSerive.redPaper(resourceId));grantTypeMap.put("購(gòu)物券",resourceId->grantTypeSerive.shopping(resourceId));grantTypeMap.put("qq會(huì)員",resourceId->grantTypeSerive.QQVip(resourceId));}public String getResult(String resourceType){//Controller根據(jù) 優(yōu)惠券類型resourceType、編碼resourceId 去查詢 發(fā)放方式grantTypeFunction<String,String> result=getGrantTypeMap.get(resourceType);if(result!=null){//傳入resourceId 執(zhí)行這段表達(dá)式獲得String型的grantTypereturn result.apply(resourceId);}return "查詢不到該優(yōu)惠券的發(fā)放方式";}}
//具體的邏輯操作public class GrantTypeSerive {public String redPaper(String resourceId){//紅包的發(fā)放方式return "每周末9點(diǎn)發(fā)放";}public String shopping(String resourceId){//購(gòu)物券的發(fā)放方式return "每周三9點(diǎn)發(fā)放";}public String QQVip(String resourceId){//qq會(huì)員的發(fā)放方式return "每周一0點(diǎn)開始秒殺";}}
public class GrantTypeController {private QueryGrantTypeService queryGrantTypeService;public String test(String resourceName){return queryGrantTypeService.getResult(resourceName);}}
你的隊(duì)友得會(huì)lambda表達(dá)式才行啊,他不會(huì)讓他自己百度去
# 最后捋一捋本文講了什么
推薦閱讀:
SpringBoot 實(shí)現(xiàn) Office 各種格式在線預(yù)覽(詳細(xì)教程,包教包會(huì))
執(zhí)行count(1)、count(*) 與 count(列名) 到底有什么區(qū)別?
互聯(lián)網(wǎng)初中高級(jí)大廠面試題(9個(gè)G) 內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬(wàn)并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!
?戳閱讀原文領(lǐng)?。?/span> 朕已閱
評(píng)論
圖片
表情



