溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么干掉if else

發(fā)布時間:2021-11-02 16:17:19 來源:億速云 閱讀:130 作者:iii 欄目:web開發(fā)

這篇文章主要介紹“怎么干掉if else”,在日常操作中,相信很多人在怎么干掉if else問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么干掉if else”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

責任鏈通用實現(xiàn)

現(xiàn)在我就默認大家都知道什么是責任鏈模式了,如果還對這個不懂的同學,可以先看看我之前的文章。

怎么干掉if else

首先,我們會有一個業(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」,那就會打印消息

怎么干掉if else

上面的邏輯,實際上就是一套通用的責任鏈的代碼,最核心的其實就是四個角色:「業(yè)務抽象接口」、「執(zhí)行過程中的上下文」、「將業(yè)務實現(xiàn)類串起來」和「一個通用的控制器執(zhí)行責任鏈」

怎么干掉if else

如果沒看懂的同學,三歪建議再對比一下代碼看看,責任鏈這種設計模式是非常好用,在項目里邊也是非常常見的。

只要把BusinessProcess/ProcessContext/ProcessTemplate/ProcessController的代碼給拷過去自己的項目中,這就能幫你把原有的if  else邏輯給干掉。

Pipeline

不知道大家看過Pipeline這個詞了沒,在學Redis的時候可能會見過,在Redis里邊我們會用Pipeline去做批量的操作。

拋開Redis的Pipeline,但從宏觀的角度上來,Pipeline其實是一種架構思想。

同時我也認為它是「責任鏈模式」的實現(xiàn)之一。

下面來看看我這邊的一個Pipeline實現(xiàn)的架構圖:

怎么干掉if else

到此,關于“怎么干掉if else”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI