設計模式——職責鏈(責任鏈)模式

目錄

職責鏈模式

小俱求實習

結構圖

實例

職責鏈模式優點

職責鏈模式缺點

使用場景

1.springmvc流程

?2.mybatis的執行流程

3.spring的過濾器和攔截器


職責鏈模式

使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關系。將這個對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它。

?一個請求有多個對象可以處理,但每個對象的處理條件或權限不同,為了避免請求發送者與多個請求處理者耦合在一起,將所有請求的處理者通過前一對象記住其下一個對象的引用而連成一條鏈;當有請求發生時,可將請求沿著這條鏈傳遞,直到有對象處理它為止。

概念可能不容易理解,我先舉一個例子說說親身體會的一件事,就叫小俱求實習吧。

小俱求實習

背景:2024上半年? 小俱正值大三下學期

在這個92?到處出沒的社會市場下,雙非一本的小俱心感沒有任何優勢,苦苦找實習,實習要求雖說沒有秋招正式高,在苦苦投遞十幾大廠下,做測評、做筆試.....不知今年大廠對雙非學歷究竟如何評估,終于小俱迎來了美團、騰訊云智、游族的面試......每次面試后,小俱深知自己哪塊還沒有學到位,甚至有的問題沒有聽過,小俱最終進入人才池。雙非就真的菜吧......小俱仍不甘心,繼續沉淀......

最終小俱通過boss投遞小廠,甘心為公司做牛做馬,同時馬不停蹄的鞏固知識,通過二面,收到了北京一家實習offer,接著有重慶、成都。

小俱滿懷期待,興致勃勃去給輔導員請假!(劃重點!)

在輔導員要求提交幾種資料后

輔導員回復:我這里只能批準3天假期,你出去實習這件事必須和領導商量。

好,小俱等待批假......

過了一天,輔導員說:領導說他只能批7天假,有的課程還沒有完,你這每周需要回來一次,經過我們的開會,批準不同意。

啊!小俱說那我每周請假,每周回來,輔導員仍不同意!

小俱苦苦說機會來之不易,希望領導理解通融!

輔導員其實僅僅傳達了領導的命令,理智的小俱不麻煩年輕的輔導員,直接自己找領導。

于是小俱親自找到領導:?

領導:我這個只能批7天的假,根據目前的教學管理,不允許實習,再說,你實習地點離學校遠,每次請7天假也不現實,你這個就屬于請長假,你需要找大領導,他同意就行!

小俱人不罷休,去找大領導!

大領導:根據目前的教學管理規定,大三不允許實習............(此處省略各種理由,態度好,很委婉),我們非常支持你們實習,你們有這種意識也非常好,我很支持!(.....好,說了很多,就是不給假。。。)

最終小俱實習失敗。

小俱一級一級的找領導,最終失敗,但小俱調整心態,繼續沉淀。

現在大概理解了職責鏈模式了吧!

結構圖

實例

結構圖,舉例請假、加薪場景

管理者抽象類??Manager?

//管理者抽象類
abstract class Manager {protected String name;public Manager(String name) {this.name = name;}//設置管理者上級protected Manager superior;public void setSuperior(Manager superior){this.superior = superior;}//請求申請public abstract void requsetApplications(Request request);}

?申請Request類

//申請
class Request{//申請類別private String requestType;//申請內容private String requestContent;//數量private int number;public void setRequestType(String requestType) {this.requestType = requestType;}public void setRequestContent(String requestContent) {this.requestContent = requestContent;}public void setNumber(int number) {this.number = number;}public String getRequestType() {return requestType;}public String getRequestContent() {return requestContent;}public int getNumber() {return number;}
}

普通經理?CommonManager?

//普通經理
class  CommonManager extends Manager{public CommonManager(String name) {super(name);}@Overridepublic void requsetApplications(Request request) {if (request.getRequestType()=="請假"&& request.getNumber()<=2){System.out.println(this.name+":"+request.getRequestContent()+"數量:"+ request.getNumber()+"天,批準");}else {if (this.superior!=null){this.superior.requsetApplications(request);}}}
}

?總監Director?

//總監
class  Director extends Manager{public Director(String name) {super(name);}@Overridepublic void requsetApplications(Request request) {if (request.getRequestType()=="請假"&&request.getNumber()<=5){System.out.println(this.name+":"+request.getRequestContent()+"數量:" + request.getNumber()+"天,批準");}else {if (this.superior!=null){this.superior.requsetApplications(request);}}}
}

總經理GeneralManager??

//總經理  都會處理
class GeneralManager extends Manager{public GeneralManager(String name) {super(name);}@Overridepublic void requsetApplications(Request request) {if (request.getRequestType()=="請假"){System.out.println(this.name+":"+request.getRequestContent()+"數量:"+request.getNumber()+"天,批準");}else if (request.getRequestType()=="加薪"&&request.getNumber()<=5000){System.out.println(this.name+":"+request.getRequestContent()+"數量:"+request.getNumber()+"元,批準");}else if (request.getRequestType()=="加薪"&&request.getNumber()>5000){System.out.println(this.name+":"+request.getRequestContent()+"數量:"+request.getNumber()+"元,再說吧");}}
}

?客戶端:

class Test{public static void main(String[] args) {CommonManager manager = new CommonManager("經理");Director director = new Director("總監");GeneralManager generalManager = new GeneralManager("總經理");//設置每個級別的上級manager.setSuperior(director);director.setSuperior(generalManager);Request request = new Request();request.setRequestType("請假");request.setRequestContent("小菜請假");request.setNumber(1);manager.requsetApplications(request);Request request2 = new Request();request2.setRequestType("請假");request2.setRequestContent("小菜請假");request2.setNumber(4);manager.requsetApplications(request2);Request request3 = new Request();request3.setRequestType("加薪");request3.setRequestContent("小菜加薪");request3.setNumber(1000);manager.requsetApplications(request3);Request request4 = new Request();request4.setRequestType("加薪");request4.setRequestContent("小菜加薪");request4.setNumber(6000);manager.requsetApplications(request4);}
}

?運行結果

職責鏈模式優點

「降低了對象之間的耦合度」

責任鏈模式讓發送者不需要知道對方的具體是哪個處理者處理請求。

「增強了系統的可擴展性」

可以根據需要增加新的請求處理類,滿足開閉原則。

「增強了給對象指派職責的靈活性」

當工作流程發生變化,客戶端可以動態地改變鏈內的成員或者調動它們的次序,也可動態地新增或者刪除責任。

「責任鏈簡化了對象之間的連接」

每個對象只需保持一個指向其后繼者的引用。

「責任分擔」

每個類只需要處理自己該處理的工作,不該處理的傳遞給下一個對象完成。

職責鏈模式缺點

  • 不能保證每個請求一定被處理。由于一個「請求沒有明確的接收者」,該請求可能一直傳到鏈的末端都得不到處理。
  • 當責任鏈比較長的時候,請求的處理可能涉及多個處理對象,系統性能受影響。
  • 職責鏈建立的合理性要靠客戶端來保證,增加了客戶端的復雜性,可能會造成循環調用。

使用場景

1.springmvc流程

就拿這個springMvc的執行流程來說,全部流程就組成了一個鏈條。每一個步驟就是一個結點,每個結點都會有對應的處理方法,每個結點處理完成之后,就會進入下一個結點。一旦某個結點出現異常,那么當前的鏈路就會停止,當前請求中斷。

2.mybatis的執行流程

mybatis的執行流程也是通過這個責任鏈模式,如首先會創建這個SqlSessionFactory,然后通過這個工廠創建一個SqlSession,這個SqlSession只是一個門面模式,會通過Executer執行增刪改查的操作,然后一個Handler用于設置參數,一個Handler用于返回結果集,最后通過這個StatementHandler將執行結果獲取。里面的整個步驟就相當于形成了一個鏈條,執行完當前結點就會進入下一個結點,如果出現異常,鏈條終止往下執行。

3.spring的過濾器和攔截器

spring里面的這個過濾器鏈路的調用,以及攔截器的鏈路調用,也是采用這種責任鏈模式

?

?

參考文章:http://t.csdnimg.cn/rkTNL

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13857.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13857.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13857.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

github設置項目分類

https://www.php.cn/faq/541957.html https://docs.github.com/zh/repositories/working-with-files/managing-files/creating-new-files

什么是回表,如何解決回表問題

下面表中:主鍵id是聚簇索引&#xff0c;name是輔助索引。 執行這樣一條SQL: select name from A where name"s;name字段是有索引&#xff0c;所以MYSQL在通過name進行査詢的時候&#xff0c;是需要掃描兩顆Btree樹的。 第一遍:先通過二級索引定位主鍵值1。第二遍:根據主鍵…

免費發布web APP的四個途徑(Python和R)

免費發布數據分析類&#x1f310;web APP的幾個途徑&#x1f4f1; 數據分析類web APP目前用來部署生信工具&#xff0c;統計工具和預測模型等&#xff0c;便利快捷&#xff0c;深受大家喜愛。而一個免費的APP部署途徑&#xff0c;對于開發和測試APP都是必要的。根據筆者的經驗…

word-形狀繪制、smartart、visio

一、人員架構圖繪制 小技巧&#xff1a; 1、ctrlshift水平復制 2、點擊圖形&#xff0c;右鍵設置為默認形狀 3、插入-形狀-右鍵-鎖定繪圖模式&#xff0c;按esc退出狀態 4、插入-形狀-新建繪圖畫布&#xff0c;代替組合問題 畫布中存在錨點&#xff0c;便于直線連接 二、s…

網絡安全相關面試題(hw)

網絡安全面試題 報錯注入有哪些函數 updatexml注入 載荷注入 insert注入 updata注入 delete注入 extractvalue&#xff08;&#xff09;注入 注入防御方法 涵數過濾 直接下載相關防范注入文件&#xff0c;通過incloud包含放在網站配置文件里面 PDO預處理,從PHP 5.1開始&…

electron中BrowserWindow的show事件沒有觸發踩坑記錄

class ElectronApi {static mainWindow;//主窗口createWindow() {try {// Create the browser window.this.mainWindow new BrowserWindow({width: 1200,height: 800,minHeight: 800,minWidth: 1200,webPreferences: {preload: preloadPath,// nodeIntegration: true,// conte…

windows怎么復制文件到vmware 中ubantu虛擬機,vmware中的虛擬機怎么聯網,NAT參數和DHCP參數。

目錄 windows怎么復制文件到vmware 中ubantu虛擬機 vmware中的虛擬機怎么聯網 NAT參數和DHCP參數。

Linux環境Docker安裝,使用Docker搭建Mysql服務實戰

1、環境&#xff1a;阿里云Linxu服務器 2、安裝docker # 1、yum 包更新到最新 yum update # 2、安裝需要的軟件包&#xff0c; yum-util 提供yum-config-manager功能&#xff0c;另外兩個是devicemapper驅動依賴的 yum install -y yum-utils device-mapper-persistent-data…

OpenSSL之API編程 - C/C++實現AES、DES、3DES、SM4對稱加密算法

文章介紹 本文章介紹了OpenSSL計算對稱加解密算法(AES、DES、3DES、SM4等)的相關接口&#xff0c;并使用C語言實現了AES和SM4加解密。 對稱加解密算法 對稱加密與非對稱加密算法 OpenSSL介紹 openssl是一個功能豐富且自包含的開源安全工具箱。它提供的主要功能有&#xff…

深度學習之基于YOLOV5的口罩檢測系統

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景 隨著全球公共衛生事件的頻發&#xff0c;口罩成為了人們日常生活中不可或缺的一部分。在公共場所&am…

10、SpringBoot 源碼分析 - 自動配置深度分析三

SpringBoot 源碼分析 - 自動配置深度分析三 refresh和自動配置大致流程AutoConfigurationImportSelector的getAutoConfigurationEntry獲取自動配置實體(重點)AutoConfigurationImportSelector的getCandidateConfigurations獲取EnableAutoConfiguration類型的名字集合AutoConfig…

Android中JVM內存回收機制

文章目錄 分代收集算法&#xff1a;新生代&#xff08;Young Generation&#xff09;老年代&#xff08;Old Generation&#xff09; 垃圾回收器&#xff1a;JVM常見三大回收算法&#xff1a;Mark-Sweep(標記清除)優點:缺點: 復制算法優點&#xff1a;缺點&#xff1a; Mark-Co…

ubuntu下交叉編譯安卓FFmpeg 和 官方指導鏈接

將之前的編譯方法在此記錄 Linux系統&#xff1a;Ubuntu 18.04.6 LTS 交叉編譯工具鏈&#xff1a;gcc-aarch64-linux-gnu gaarch64-linux-gnu ffmpeg版本&#xff1a;5.1.3 1.下載源碼 ffmpeg官網&#xff1a;https://ffmpeg.org/download.html#releases 下載完成后&#x…

Edge瀏覽器“此頁存在問題”解決思路

Edge瀏覽器顯示“此頁存在問題”解決思路 大家平時使用Edge瀏覽器時&#xff0c;是否和我一樣會突然出現“此頁存在問題”的情況&#xff1f; 經過百度查詢后我找了一種情況和解決辦法&#xff0c;能夠大大減少這類問題的出現。出現“此頁存在問題”可能是因為之前使用過軟件…

每天一個數據分析題(三百四十一)

如何獲取更多優質流量是電商行業中重要課題&#xff0c;下列哪些屬于流量類指標 A. 平均訪問深度 B. 跳失次數 C. 瀏覽量 D. 客單價 數據分析認證考試介紹&#xff1a;點擊進入 題目來源于CDA模擬題庫 點擊此處獲取答案

Linux基礎命令[27]-gpasswd

文章目錄 1. gpasswd 命令說明2. gpasswd 命令語法3. gpasswd 命令示例3.1 不加參數3.2 -a&#xff08;將用戶加入組&#xff09;3.3 -d&#xff08;從組中刪除用戶&#xff09;3.4 -r&#xff08;刪除組密碼&#xff09;3.5 -M&#xff08;多個用戶一起加入組&#xff09;3.6 …

React中 將UI 視為樹

當 React 應用程序逐漸成形時&#xff0c;許多組件會出現嵌套。那么 React 是如何跟蹤應用程序組件結構的&#xff1f; React 以及許多其他 UI 庫&#xff0c;將 UI 建模為樹。將應用程序視為樹對于理解組件之間的關系以及調試性能和狀態管理等未來將會遇到的一些概念非常有用。…

Python教程:使用Python和PyQt編寫進制轉換器工具

1.介紹 在現代計算中&#xff0c;進制轉換是一項常見且重要的任務。為了簡化這個過程&#xff0c;我們也可以利用Python和PyQt自己寫一個直觀且易于使用的進制轉換器工具。這個工具將支持二進制、八進制、十進制和十六進制的相互轉換&#xff0c;并提供良好的用戶界面和交互體…

Java設計模式(23種設計模式 重點介紹一些常用的)

創建型模式&#xff0c;共五種&#xff1a;工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。結構型模式&#xff0c;共七種&#xff1a;適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。行為型模式&#xff0c;共十一種&#xff1a;…

MySQL---函數與約束

目錄 一、函數 1. 字符串函數 2. 數值函數 3. 日期函數 4. 流程函數 5. 總結 二、約束 1. 概述 2. 約束演示 3. 外鍵約束 3.1 添加外鍵 3.2 刪除外鍵 3.3 外鍵刪除更新行為 4. 總結 一、函數 1. 字符串函數 命令如下所示&#xff1a; -- concat select concat("Hel…