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

三國演義:責任鏈模式

開發 前端
大家好,我是老田,今天我給大家分享設計模式中的責任鏈模式。用貼切的生活故事,以及真實項目場景來講設計模式,最后用一句話來總結這個設計模式。

[[403844]]

大家好,我是老田,今天我給大家分享設計模式中的責任鏈模式。用貼切的生活故事,以及真實項目場景來講設計模式,最后用一句話來總結這個設計模式。

關于設計模式系列,前面我們已經分享過:

故事

前兩天,沒事又刷了一遍三國演義,看到關羽身在曹營心在漢,聽說劉備在袁紹那里,然后就上演了“過五關,斬六將”。

[[403845]]

關羽過五關斬六將主要內容:

  • 第一關,東嶺關,斬守將孔秀。

東嶺關,守關將名叫孔秀,本是黃巾余黨,歸降曹操之后,帶著五百人奉命防守東嶺關。關羽車隊從關前通過時,孔秀索要通關文牒,與關羽發生沖突,只一個回合,就被關羽斬殺。

  • 第二關,洛陽關,孟坦和韓福。

關羽過了東嶺關,在要過洛陽時,韓福、孟坦用鹿角攔住道路。先是孟坦挑戰,與關羽說翻,交手不敵,孟坦撥馬回跑,引關公來追,這樣韓福就可以在后面射箭擒拿關公,可誰想到關公赤兔馬快,從后面趕上孟坦,一刀就把孟坦給劈了。韓福慌得射了一箭,中關公左臂,關公忍住箭傷,也沖過鹿角,一刀斬殺韓福,于是過洛陽。

  • 第三關,汜水關,卞喜。

在得知關羽過關斬將,東嶺關孔秀、洛陽韓福、孟坦都被殺害,卞喜自思難以抵擋關公。于是就假意迎接關公,在鎮國寺安排下刀斧手,準備伺機殺死關公。幸虧有鎮國寺老方丈普凈給警示,關公這才察覺出陰謀,與卞喜鬧翻,一刀斬殺卞喜,于是關公過汜水關。

  • 第四關,王植。

這王植是韓福的親家,聽說韓福被關公殺死,十分憤怒,于是就要為韓福報仇。在關公到達滎陽時,王植在館驛設宴,宴請關公和二位皇嫂。卻是暗中派從事胡班放火,想要燒死關公。但胡班因關公給父親胡華帶信的緣故,向關羽告了密。關羽和二位皇嫂得以提前逃離館驛,胡班卻假意放火,迷惑王植。不過王植后來察覺,殺了胡班,來追關羽時,被關羽斬殺,于是關公過滎陽。

  • 第五關,黃河渡口,秦琪。

這秦琪不僅是夏侯惇的愛將,更是老將軍蔡陽的外甥,奉命守衛黃河渡口,盤查過往船只。關公到黃河渡口時,要找船只渡河,被秦琪攔住,秦琪不僅不放關公等人渡河,反而口出狂言,終于激怒關公,被關公斬殺

這就是關羽過五關斬六將的全部過程。

這個故事情節讓我想起了一個設計模式:責任鏈模式。

其實,我們生活中也有著非常多的責任鏈模式。比如:基本上每個公司都有自己的OA系統,主要是員工基本信息、請假、調休、報銷等功能。如果,我有事需要請假兩天,于是登錄OA系統,發起請假審批。

由于,對于請假時間的長短公司有如下規定:

小于等于半天,審批環節:項目負責人

大于半天,小于等于1天的,審批環節:項目負責人+技術總監

超過1天,審批環節:項目負責人+技術總監+Boss

可以看得出來,我請假審批流程為項目負責人+技術總監+Boss。

到底什么是責任鏈設計模式?

什么是責任鏈模式呢

責任鏈模式英文解釋為:

Avoid coupling the sender of a request to its receiver bygiving more than one object a chance to handle the request.Chainthe receiving objects and pass the request along the chain until anobject handles it.

責任鏈模式(Chain of Responsibility Pattern)將鏈中每一個節點都看作一個對象,每個節點處理的請求均不同,且內部自動維護下一個節點對象。當一個請求從鏈式的首端發出時,會沿著責任鏈預設的路徑依次傳遞到每一個節點對象,直至被鏈中的某個對象處理為止,屬于行為型設計模式。

責任鏈模式通用代碼

Java實現責任鏈設計模式如下:

  1. public abstract class Handler { 
  2.         protected Handler nextHandler = null
  3.         public abstract void handle(); 
  4.         public Handler getNextHandler() { 
  5.             return nextHandler; 
  6.         } 
  7.         public void setNextHandler(Handler nextHandler) { 
  8.             this.nextHandler = nextHandler; 
  9.         } 
  10.  
  11. public class HandlerA extends Handler{ 
  12.         @Override 
  13.         public void handle() { 
  14.             if(nextHandler == null){ 
  15.                 System.out.println("HandlerA handle ..."); 
  16.             }else
  17.                 nextHandler.handle(); 
  18.             } 
  19.         } 
  20.  
  21. public class HandlerB extends Handler{ 
  22.         @Override 
  23.         public void handle() { 
  24.             if(nextHandler == null){ 
  25.                 System.out.println("HandlerB handle ..."); 
  26.             }else
  27.                 nextHandler.handle(); 
  28.             } 
  29.         } 
  30.  
  31. public class HandlerC extends Handler{ 
  32.     @Override 
  33.     public void handle() { 
  34.         if(getNextHandler() == null){ 
  35.             System.out.println("HandlerC handle ..."); 
  36.         }else
  37.             getNextHandler().handle(); 
  38.         } 
  39.     } 
  40. //測試 
  41. public class  Client{ 
  42.     public static void main(String[] args) { 
  43.         Handler handlerA = new HandlerA(); 
  44.         Handler handlerB = new HandlerB(); 
  45.         handlerA.setNextHandler(handlerB); 
  46.         handlerA.handle(); 
  47.     } 

運行結果:

  1. HandlerC handle ... 

從上面代碼,我們可以畫出UML圖:

從UML圖中,我們又可以看出,責任鏈模式中有兩個非常重要的角色:

(1)、抽象處理者角色(Handler)

定義處理請求的接口。接口可以也可以給出一個方法以設定和返回對下個對象引用。這個角色通常由一個Java抽象類或者Java接口實現。

(2)、具體處理者角色(HandlerA、HandlerB、HandlerC)

具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下個對象。由于具體處理者持有對下家的引用。

責任鏈模式的優缺點

  • 優點:請求和處理分開,兩者解耦,提供系統的靈活性。
  • 缺點:性能能問,一個鏈非常長的時候,非常耗時。因為我們避免建立很長的鏈。

生活中的案例

在日常生活中,責任鏈模式是比較常見的。我們平時處理工作中的一些事務,往往是各部門協同合作來完成某一個任務的。而每個部門都有各自的職責,因此,很多時候事情完成一半,便會轉交到下一個部門,直到所有部門都審批通過,事情才能完成。

責任鏈模式主要解耦了請求與處理,客戶只需將請求發送到鏈上即可,不需要關心請求的具體內容和處理細節,請求會自動進行傳遞,直至有節點對象進行處理。

責任鏈模式主要適用于以下應用場景:

  • 多個對象可以處理同一請求,但具體由哪個對象處理則在運行時動態決定。
  • 在不明確指定接收者的情況下,向多個對象中的一個提交請求。
  • 可動態指定一組對象處理請求。

請假流程的代碼實現

下面我們來對,前面的案例:OA上請假流程做一個Java代碼的實現。

抽象處理者:領導類

  1. public abstract class Leader { 
  2.     private Leader next
  3.     public void setNext(Leader next) { 
  4.         this.next = next
  5.     } 
  6.     public Leader getNext() { 
  7.         return next
  8.     } 
  9.     //處理請求的方法 
  10.     public abstract void handleRequest(double LeaveDays); 

項目負責人

  1. public class ProjectLeader extends Leader { 
  2.     @Override 
  3.     public void handleRequest(double LeaveDays) { 
  4.         if (LeaveDays <= 0.5) { 
  5.             System.out.println("項目負責人批準您請假" + LeaveDays + "天。"); 
  6.         } else { 
  7.             if (getNext() != null) { 
  8.                 getNext().handleRequest(LeaveDays); 
  9.             } else { 
  10.                 System.out.println("請假天數太多,沒有人批準該假條!"); 
  11.             } 
  12.         } 
  13.     } 

技術總監

  1. public class TechnicalDirectorLeader extends Leader { 
  2.  
  3.     @Override 
  4.     public void handleRequest(double LeaveDays) { 
  5.         if (LeaveDays <= 1) { 
  6.             System.out.println("技術總監批準您請假" + LeaveDays + "天。"); 
  7.         } else { 
  8.             if (getNext() != null) { 
  9.                 getNext().handleRequest(LeaveDays); 
  10.             } else { 
  11.                 System.out.println("請假天數太多,沒有人批準該假條!"); 
  12.             } 
  13.         } 
  14.     } 

Boss

  1. public class BossLeader extends Leader { 
  2.     @Override 
  3.     public void handleRequest(double LeaveDays) { 
  4.         if (LeaveDays >= 2 && LeaveDays <= 30) { 
  5.             System.out.println("Boss批準您請假" + LeaveDays + "天。"); 
  6.         } else { 
  7.             if (getNext() != null) { 
  8.                 getNext().handleRequest(LeaveDays); 
  9.             } else { 
  10.                 System.out.println("請假天數太多,沒有人批準該假條!"); 
  11.             } 
  12.         } 
  13.     } 

發起審批

  1. public class LeaveApproval { 
  2.     public static void main(String[] args) { 
  3.         //組裝責任鏈 
  4.         Leader projectLeader = new ProjectLeader(); 
  5.         Leader technicalDirectorLeader = new TechnicalDirectorLeader(); 
  6.         Leader bossLeader = new BossLeader(); 
  7.  
  8.         projectLeader.setNext(technicalDirectorLeader); 
  9.         technicalDirectorLeader.setNext(bossLeader); 
  10.  
  11.         //請假兩天,提交請假流程,開啟審批環節, 
  12.         projectLeader.handleRequest(2); 
  13.     } 

審批結果

  1. Boss批準您請假2.0天。 

如果請假天數是31天,審批結果

  1. 請假天數太多,沒有人批準該假條! 

整個請假流程為:

把這張流程圖改成縱向:

就這么一環套一環的,使用上面兩個例子和兩張圖來理解責任鏈模式是不是就更輕松了?

自己吹牛逼,沒什么用,下面來看看大神們是怎么使用責任鏈模式的。

大佬們是如何使用的

在Spring、Mybatis等框架中,都用使用到責任鏈模式,下面先來看在Spring中是如何使用的。

在Spring MVC中的org.springframework.web.servlet.DispatcherServlet類中:

getHandler 方法的處理使用到了責任鏈模式,handlerMappings是之前 Spring 容器初始化好的,通過遍歷 handlerMappings查找與request匹配的 Handler, 這里返回 HandlerExecutionChain 對象。這個 HandlerExecutionChain對象到后面執行的時候再分析為什么返回的是這樣一個對象。

  1. @Nullable 
  2. protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { 
  3.  if (this.handlerMappings != null) { 
  4.   for (HandlerMapping mapping : this.handlerMappings) { 
  5.    HandlerExecutionChain handler = mapping.getHandler(request); 
  6.    if (handler != null) { 
  7.     return handler; 
  8.    } 
  9.   } 
  10.  } 
  11.  return null

以上便是責任鏈模式在Spring的具體使用,關于Mybatis中責任鏈模式的使用,請看這篇文章:

總結

本文通過關二爺的過五關斬六將和OA系統中的請假審批流程,完美的解釋了責任鏈設計模式。

最后用一句話來總結責任鏈模式:

各人自掃門前雪,莫管他人瓦上霜。

本文轉載自微信公眾號「Java后端技術全棧」,可以通過以下二維碼關注。轉載本文請聯系Java后端技術全棧公眾號。

 

責任編輯:武曉燕 來源: Java后端技術全棧
相關推薦

2013-05-24 09:19:48

VMware混合云

2012-05-28 09:25:09

新數據中心

2012-08-13 09:37:04

IntelAMDARM

2012-02-22 09:47:26

2012-12-31 10:12:24

2013-09-24 11:26:42

微服務器x86ARM

2025-03-07 09:00:00

2020-03-27 08:17:01

運維DBA服務器

2009-08-26 21:32:54

數據中心集中管理

2018-11-06 09:39:47

芯片蘋果高通

2021-12-24 07:50:45

責任鏈模式設計

2012-03-28 13:28:56

Java設計模式

2022-12-28 08:08:57

2010-04-30 09:00:00

2010-02-25 12:40:34

網關

2012-08-01 09:34:51

代碼編輯器開發代碼

2024-12-03 15:52:45

責任鏈Java

2022-11-01 08:46:20

責任鏈模式對象

2011-09-22 10:29:26

三國塔防游戲

2014-03-31 17:35:04

云計算
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品久久久 | 91社区在线高清 | 成人精品一区二区三区中文字幕 | 爱高潮www亚洲精品 中文字幕免费视频 | 中文成人在线 | 97国产精品视频人人做人人爱 | 国产精品久久国产精品 | 美女视频一区 | 综合久久亚洲 | 亚洲精品一区二区网址 | 涩爱av一区二区三区 | 久久久国产亚洲精品 | 羞羞视频在线观看免费观看 | 91精品国产欧美一区二区成人 | 国产韩国精品一区二区三区 | 日韩在线视频一区 | www成人免费| 国产精品一区视频 | 欧美4p| 免费黄色网址视频 | 午夜国产 | 亚洲www | 污污的网站在线观看 | 免费久久99精品国产婷婷六月 | 国产午夜在线观看 | 国产精品999| 国产精品欧美一区二区 | 久久精品在线免费视频 | 国产亚洲欧美日韩精品一区二区三区 | 全免费a级毛片免费看视频免 | 欧美aaaaaa| 最新高清无码专区 | 免费一级黄色电影 | 国产91丝袜在线熟 | 国产日韩久久 | 九九久久久 | 国产情侣在线看 | 91久久久久| 国产综合精品一区二区三区 | 亚洲一区二区三区在线 | 午夜影院在线免费观看视频 |