成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

if-else嵌套太深?教你一個新手都能掌握的設計模式搞定!

云計算 虛擬化
不是什么地方都適合使用設計模式,如果邏輯簡單,你硬要使用設計模式,只會帶來結構上的復雜,大家可以按照大家的業務場景來使用。

[[321098]]

 我也不用設計模式

很多人覺得自己寫的是業務代碼,按照邏輯寫下去,再把公用的方法抽出來復用就可以了,設計模式根本就沒必要用,更沒必要學。

一開始的時候,我也是這么想,直到我遇到。。。

舉個栗子

我們先看一個普通的下單攔截接口。

基本邏輯,參數安全攔截,次數攔截,規則攔截,都通過,返回允許下單,任意一個失敗,返回對應的失敗原因。

多層嵌套if寫法

我們正常多層嵌套if的寫法

 

  1. /** 
  2.  * @author saier 
  3.  * @date 2020/3/31 18:03 
  4.  */ 
  5. public class Order { 
  6.     public Message interrupt1(){ 
  7.         return null
  8.     } 
  9.     public Message interrupt2(){ 
  10.         return null
  11.     } 
  12.     public Message interrupt3(){ 
  13.         return null
  14.     } 
  15.     public Message interrupt4(){ 
  16.         return null
  17.     } 
  18.     public Message interrupt5(){ 
  19.         return null
  20.     } 
  21.  
  22.     public static void main(String[] args) { 
  23.         Order order= new Order(); 
  24.         if(order.interrupt1().getResult() == 1){ 
  25.             if(order.interrupt2().getResult() == 1){ 
  26.                 if(order.interrupt3().getResult() == 1){ 
  27.                     if(order.interrupt4().getResult() == 1){ 
  28.                         if(order.interrupt5().getResult() == 1){ 
  29.                             System.out.println("success"); 
  30.                         } 
  31.                     } 
  32.                 } 
  33.             } 
  34.         } 
  35.  
  36.     } 
  37.  
  38. @Data 
  39. class Message { 
  40.     private int result; 
  41.     private String msg; 

異常處理邏輯

或者有些利用異常做邏輯,代碼會簡單一點

 

  1. /** 
  2.  * @author saier 
  3.  * @date 2020/3/31 18:03 
  4.  */ 
  5. public class Order2 { 
  6.     public void interrupt1(){ 
  7.  
  8.     } 
  9.     public void interrupt2(){ 
  10.  
  11.     } 
  12.     public void interrupt3(){ 
  13.         //失敗 
  14.         throw new RuntimeException(); 
  15.     } 
  16.     public void interrupt4(){ 
  17.         //失敗 
  18.         throw new RuntimeException(); 
  19.     } 
  20.     public void interrupt5(){ 
  21.         //失敗 
  22.         throw new RuntimeException(); 
  23.     } 
  24.  
  25.     public static void main(String[] args) { 
  26.         Order2 order2= new Order2(); 
  27.         try{ 
  28.             order2.interrupt1(); 
  29.             order2.interrupt2(); 
  30.             order2.interrupt3(); 
  31.             order2.interrupt4(); 
  32.             order2.interrupt5(); 
  33.             System.out.println("success"); 
  34.         }catch (RuntimeException e){ 
  35.             System.out.println("fail"); 
  36.         } 
  37.  
  38.     } 

一開始,我就直接使用異常來做邏輯。但后續邏輯越來越復雜之后,也會出現一些問題。例如異常只能返回異常信息,不能返回更多的字段信息。

后面也留意到,異常做邏輯,在阿里規范是禁止的。

阿里代碼規范 :

【強制】異常不要用來做流程控制,條件控制。

說明:異常設計的初衷是解決程序運行中的各種意外情況,且異常的處理效率比條件判斷方式要低很多。

更重要的是,代碼可讀性太差了,隨時一個方法的異常拋出來,還要考慮代碼本身的異常。

沒更好的辦法,只能考慮設計模式了

怎么改,會使代碼的可讀性高,擴展性好?

在同事的提醒下,突然想起了設計模式!

我們希望達到的目的

  1. 代碼沒有這么多if else嵌套,可讀性高
  2. 如果新增新的攔截邏輯簡單方便,不影響原本的邏輯,擴展性好
  3. 可以很方便地調換攔截邏輯順序,低耦合

責任鏈模式

在這種場景下,非常適合責任鏈模式。(什么場景使用什么設計模式,這就需要平時有積累,知道各種設計模式的基本使用)

責任鏈,顧名思義,就是用來處理相關事務責任的一條執行鏈,執行鏈上有多個節點,每個節點都有機會(條件匹配)處理請求事務,如果某個節點處理完了就可以根據實際業務需求傳遞給下一個節點繼續處理或者返回處理完畢。

首先,建立過濾器的抽象類

 

  1. public abstract class AbstractFilter { 
  2.  
  3.     private AbstractFilter nextFilter; 
  4.  
  5.     /** 
  6.      * 責任鏈的下一個元素 
  7.      */ 
  8.     public void setNextFilter(AbstractFilter nextFilter){ 
  9.         this.nextFilter = nextFilter; 
  10.     } 
  11.  
  12.  
  13.     public AbstractFilter getLastFilter(){ 
  14.         if(this.nextFilter != null){ 
  15.             return this.nextFilter.getLastFilter(); 
  16.         }else
  17.             return this; 
  18.         } 
  19.     } 
  20.  
  21.     public void filter(FilterRequest filterRequest, Response response){ 
  22.         doFilter(filterRequest,response); 
  23.         if(response.isFilterNext() && nextFilter != null){ 
  24.             nextFilter.filter(filterRequest,response); 
  25.         } 
  26.     } 
  27.  
  28.     /** 
  29.      * 具體攔截邏輯 
  30.      */ 
  31.     public abstract void doFilter(FilterRequest filterRequest, Response response); 
  32.  
  33.     /** 
  34.      * 根據攔截結果做處理 
  35.      */ 
  36.     public void exec(FilterRequest filterRequest, Response response){ 
  37.     } 

過濾器的實現類

 

  1. @Component 
  2. @Order(5) 
  3. public class CheckParamFilter1 extends AbstractFilter { 
  4.     @Override 
  5.     public void doFilter(FilterRequest filterRequest, Response response) { 
  6.  
  7.     } 
  8.  
  9. @Component 
  10. @Order(10) 
  11. public class CheckParamFilter2 extends AbstractFilter { 
  12.     @Override 
  13.     public void doFilter(FilterRequest filterRequest, Response response) { 
  14.  
  15.     } 

使用Order注解,確定過濾器的順序,后續在spring注入的時候,會有奇效

  1. //利用spring的自動注入機制 
  2. @Autowired 
  3. List<AbstractFilter> abstractFilterList; 
  4.  
  5. private AbstractFilter firstFilter; 
  6.  
  7. //spring注入后自動執行 
  8. @PostConstruct 
  9. public void initializeChainFilter(){ 
  10.     //把所有調用的邏輯注入到責任鏈,按照Order排序,越小優先級越高 
  11.     for(int i = 0;i<abstractFilterList.size();i++){ 
  12.         if(i == 0){ 
  13.             firstFilter = abstractFilterList.get(i); 
  14.         }else
  15.             firstFilter.getLastFilter().setNextFilter(abstractFilterList.get(i)); 
  16.         } 
  17.     } 
  18.  
  19. //直接使用 
  20. public Response exec(){ 
  21.     firstFilter.filter(filterRequest, response); 
  22.     return response; 

使用設計模式的好處

看下使用責任鏈模式后,有什么好處!

  1. 新增攔截邏輯,只需要再實現一個AbstractFilter類即可
  2. 修改攔截順序,只需要修改Order注解的大小,越小,優先級越高
  3. 代碼清晰,所有處理邏輯下沉到實現類中

使用設計模式的缺點

做到了低耦合,高擴展。但也帶來了一些不好的地方

  1. 邏輯更復雜,用了鏈式等數據結構,要注意單例的問題,不能重復使用
  2. 類數量激增,一個攔截器就一個類

最后小結一下

不是什么地方都適合使用設計模式,如果邏輯簡單,你硬要使用設計模式,只會帶來結構上的復雜,大家可以按照大家的業務場景來使用。

關于作者:南山獅:理工男,7年互聯網電商系統開發經驗,知識分享領域探索小白。

責任編輯:武曉燕 來源: Hollis
相關推薦

2023-06-02 07:30:24

If-else結構流程控制

2022-07-11 08:16:55

策略模式if-else

2013-03-06 10:28:57

ifJava

2021-04-13 06:39:13

代碼重構code

2021-03-10 07:20:43

if-else靜態代碼

2024-04-26 08:58:54

if-else代碼JavaSpring

2021-11-04 08:53:00

if-else代碼Java

2020-04-30 09:17:28

數據分析電商分析思維

2019-08-14 16:56:38

Python職責模式請假

2020-10-22 09:20:22

SQLNoSQL 數據庫

2020-07-17 13:01:44

If-Else代碼編程

2020-04-09 08:29:50

編程語言事件驅動

2022-05-26 10:42:30

數據權限注解

2025-04-29 01:50:00

if-else語法映射

2020-06-04 09:18:52

CTOif-else代碼

2018-08-15 15:23:48

視頻

2022-01-13 10:45:59

if-else代碼Java

2020-12-15 09:31:58

CTOif-else代碼

2020-05-13 14:15:25

if-else代碼前端

2025-04-24 08:40:00

JavaScript代碼return語句
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕日韩专区 | 亚洲精品在线91 | 国产欧美久久精品 | 正在播放国产精品 | 天天影视网天天综合色在线播放 | 日韩在线视频播放 | 欧美一区2区三区4区公司 | 日本人和亚洲人zjzjhd | 国产精品毛片无码 | 91久久北条麻妃一区二区三区 | 麻豆一区二区三区精品视频 | 91国在线高清视频 | 中文字幕二区三区 | 午夜91| 国产一区二区三区四区hd | 中文字幕在线人 | aaa级片 | 午夜电影网| 欧美在线a | 午夜精品在线 | 天天操天天射综合网 | 亚洲人精品 | 亚洲欧美一区二区三区国产精品 | 天天躁日日躁aaaa视频 | 日韩中文久久 | 国产精品亚洲第一区在线暖暖韩国 | 亚洲毛片在线 | 欧美成人h版在线观看 | 精品一区二区三区四区五区 | 国产福利资源 | 狠狠综合久久av一区二区小说 | 999久久久精品 | 精品av久久久久电影 | 欧美性视频在线播放 | 久久一本| 欧美日韩网站 | 欧美日韩精品一区 | 国产福利免费视频 | 一色一黄视频 | 精品美女| 免费在线黄 |