您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么干掉if else”,在日常操作中,相信很多人在怎么干掉if else問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么干掉if else”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
責任鏈通用實現(xiàn)
現(xiàn)在我就默認大家都知道什么是責任鏈模式了,如果還對這個不懂的同學,可以先看看我之前的文章。
首先,我們會有一個業(yè)務執(zhí)行器接口,所有的業(yè)務實現(xiàn)都會實現(xiàn)該接口,這意味著上圖的邏輯A、B、C都會實現(xiàn)這個接口
/** * 業(yè)務執(zhí)行器 * @author 三歪 */ public interface BusinessProcess { void process(ProcessContext context); }
可以看到的是接口異常的簡單,只有一個process處理的方法,方法接收的是ProcessContext
為什么process方法需要接收ProcessContext?很簡單,我們在處理邏輯A、B、C的時候,可能邏輯B需要依賴邏輯A的處理結果。于是我們就需要有一個載體把這些給記錄下來。
所以,我們就有了ProcessContext,它代表的是責任鏈的上下文。
/** * 責任鏈上下文 * @author 3y */ public class ProcessContext { // 標識責任鏈的code private String code; // 存儲上下文的真正載體 private Model model; // 責任鏈中斷的標識 private Boolean needBreak = false; }
現(xiàn)在責任鏈的執(zhí)行器和責任鏈所涉及的上下文都已經(jīng)有了,這意味著我們已經(jīng)有了責任鏈最主要的抽象了。
接下來就是我們需要把鏈給串起來,于是我們需要一個模板,其實我們做的就是用一個List來把BusinessProcess的子類給串起來。
/** * 業(yè)務執(zhí)行模板(把責任鏈的邏輯串起來) * @author 3y */ public class ProcessTemplate { private List<BusinessProcess> processList; public List<BusinessProcess> getProcessList() { return processList; } public void setProcessList(List<BusinessProcess> processList) { this.processList = processList; } }
OK,現(xiàn)在我們已經(jīng)把責任鏈的整塊給抽象好了,接下來就是暴露流程控制器去執(zhí)行這個責任鏈:
/** * 責任鏈的流程控制器(整個責任鏈的執(zhí)行流程通用控制) * @author 3y */ @Data public class ProcessController { // 不同的code 對應不同的責任鏈 private Map<String, ProcessTemplate> templateConfig = null; public void process(ProcessContext context) { //根據(jù)上下文的Code 執(zhí)行不同的責任鏈 String businessCode = context.getCode(); ProcessTemplate processTemplate = templateConfig.get(businessCode); List<BusinessProcess> actionList = processTemplate.getProcessList(); //遍歷某個責任鏈的流程節(jié)點 for (BusinessProcess action : actionList) { try { action.process(context); if (context.getNeedBreak()) { break; } } catch (Exception e2) { //... } } } }
我們可以看到的是在ProcessController執(zhí)行鏈通用的流程控制器上會有一個Map去存儲多個責任鏈的模板,這樣做的好處就是:ProcessController這個流程控制器可以根據(jù)code支持多個責任鏈執(zhí)行。
接下來就是我們有具體的BusinessProcess去加入到ProcessTemplate的鏈上,然后調用ProcessController的方法去執(zhí)行整一條推送鏈。
一般我們在XML注入就好了,比如說現(xiàn)在我們有兩個BusinessProcess的實現(xiàn),分別是白名單和發(fā)消息的邏輯:
/** * 白名單處理器 * @author 3y */ @Service public class WhiteListProcess implements BusinessProcess { @Override public void process(ProcessContext context) { UserModel user = (UserModel) context.getModel(); if ("3y".equals(user.getName())) { context.setNeedBreak(true); } } } /** * 發(fā)消息處理器 * @author 三歪 */ @Service public class SendMessageProcess implements BusinessProcess { @Override public void process(ProcessContext context) { UserModel user = (UserModel) context.getModel(); System.out.println("給"+user.getName()+"發(fā)消息"); } }
然后我們把上面兩個處理器添加到ProcessTemplate的模板上,把ProcessTemplate添加到ProcessController的Map上:
<!--發(fā)送消息的責任鏈--> <bean id="sendMessageTemplate" class="com.chainofresponsibility.ProcessTemplate"> <property name="processList"> <list> <ref bean="whiteListProcess"></ref> <ref bean="sendMessageProcess"></ref> </list> </property> </bean> <!--通用流程處理器,維護多條責任鏈--> <bean id="processController" class="com.chainofresponsibility.ProcessController"> <property name="templateConfig"> <map> <entry key="sendMessage" value-ref="sendMessageTemplate" /> </map> </property> </bean>
然后我們在接口里邊執(zhí)行這個責任鏈:
@RestController public class UserController { @Autowired private ProcessController processController; @RequestMapping("/send") public void send(String userName) { // 構建上下文 ProcessContext processContext = new ProcessContext(); UserModel userModel = new UserModel(); userModel.setAge("24"); userModel.setName(userName); processContext.setModel(userModel); processContext.setCode("sendMessage"); processController.process(processContext); } }
我做了這么大的一套東西實現(xiàn)了什么功能?其實就一個if邏輯:
if ("3y".equals(userModel.getName())) { return; } System.out.println("給" + userModel.getName() + "發(fā)消息");
下面我們還是來看看效果,從功能上我們可以發(fā)現(xiàn),只要我們輸入的不是「3y」,那就會打印消息
上面的邏輯,實際上就是一套通用的責任鏈的代碼,最核心的其實就是四個角色:「業(yè)務抽象接口」、「執(zhí)行過程中的上下文」、「將業(yè)務實現(xiàn)類串起來」和「一個通用的控制器執(zhí)行責任鏈」
如果沒看懂的同學,三歪建議再對比一下代碼看看,責任鏈這種設計模式是非常好用,在項目里邊也是非常常見的。
只要把BusinessProcess/ProcessContext/ProcessTemplate/ProcessController的代碼給拷過去自己的項目中,這就能幫你把原有的if else邏輯給干掉。
Pipeline
不知道大家看過Pipeline這個詞了沒,在學Redis的時候可能會見過,在Redis里邊我們會用Pipeline去做批量的操作。
拋開Redis的Pipeline,但從宏觀的角度上來,Pipeline其實是一種架構思想。
同時我也認為它是「責任鏈模式」的實現(xiàn)之一。
下面來看看我這邊的一個Pipeline實現(xiàn)的架構圖:
到此,關于“怎么干掉if else”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。