責任鏈模式(設計模式)

責任鏈模式(Chain of Responsibility Pattern)是一種行為設計模式,它允許多個對象有機會處理請求,從而避免請求的發送者和接收者之間的耦合。將這些對象連成一條鏈,并沿著這條鏈傳遞請求,直到有一個對象處理它為止。

責任鏈模式的核心思想

責任鏈模式的核心思想是將處理請求的對象鏈成一個鏈條,讓請求沿著鏈條傳遞,直到有對象處理它。這種模式可以動態地調整請求的處理順序,并且增加新的處理對象時不需要修改已有的代碼,符合開閉原則。

責任鏈模式的組成部分

Handler(處理者接口或抽象類):定義一個處理請求的接口,并且通常包含一個指向下一個處理者的引用。
ConcreteHandler(具體處理者):實現處理者接口,處理它所負責的請求,或者將請求傳遞給下一個處理者。
Client(客戶端):創建處理鏈,并向鏈上的處理者發送請求。

責任鏈模式的實現

下面是一個簡單的責任鏈模式的實現示例,使用 Java 編寫:

1. 定義處理者接口或抽象類
// 處理者接口
public abstract class Handler {protected Handler successor;public void setSuccessor(Handler successor) {this.successor = successor;}public abstract void handleRequest(String request);
}
2. 實現具體處理者
// 具體處理者1
public class ConcreteHandler1 extends Handler {@Overridepublic void handleRequest(String request) {if (request.equals("Request1")) {System.out.println("ConcreteHandler1 handled the request.");} else if (successor != null) {successor.handleRequest(request);}}
}// 具體處理者2
public class ConcreteHandler2 extends Handler {@Overridepublic void handleRequest(String request) {if (request.equals("Request2")) {System.out.println("ConcreteHandler2 handled the request.");} else if (successor != null) {successor.handleRequest(request);}}
}// 具體處理者3
public class ConcreteHandler3 extends Handler {@Overridepublic void handleRequest(String request) {if (request.equals("Request3")) {System.out.println("ConcreteHandler3 handled the request.");} else if (successor != null) {successor.handleRequest(request);}}
}
3. 客戶端代碼
public class ChainOfResponsibilityPatternDemo {public static void main(String[] args) {// 創建處理者Handler handler1 = new ConcreteHandler1();Handler handler2 = new ConcreteHandler2();Handler handler3 = new ConcreteHandler3();// 設置責任鏈handler1.setSuccessor(handler2);handler2.setSuccessor(handler3);// 測試請求handler1.handleRequest("Request1");handler1.handleRequest("Request2");handler1.handleRequest("Request3");handler1.handleRequest("UnknownRequest");}
}
運行結果
ConcreteHandler1 handled the request.
ConcreteHandler2 handled the request.
ConcreteHandler3 handled the request.

責任鏈模式總結

責任鏈模式通過將請求的發送者和接收者解耦,使得多個對象都有機會處理這個請求。請求沿著處理鏈傳遞,直到有一個對象處理它為止。這樣,責任鏈模式提供了一種靈活的方式來處理請求。
責任鏈模式的優缺點
優點:
降低耦合度。一個對象無需知道是哪個對象處理其請求。
增強了系統的可擴展性。可以通過增加新的處理者來擴展系統。
提供了一種靈活的方式來處理請求。
缺點:
不能保證每個請求一定會被處理。請求可能會傳遞到鏈的末端而沒有處理者處理它。
可能會影響性能,特別是當鏈條過長時,每個請求都需要從鏈頭遍歷到鏈尾。

應用場景

責任鏈模式適用于以下場景:
有多個對象可以處理某個請求,但具體處理者在運行時動態確定。
希望將請求的發送者和接收者解耦。
可以動態地指定處理請求的順序。
通過責任鏈模式,可以靈活地組織請求的處理過程,提高系統的可維護性和擴展性。
責任鏈模式的應用場景非常廣泛,包括但不限于:
1.用戶認證和授權:將用戶的認證和授權環節抽象成一個個的處理器,并按照順序組成一個責任鏈。當用戶發送請求時,責任鏈中的處理器依次進行認證和授權操作。
2.日志記錄:將日志記錄的邏輯封裝到多個處理器中,并按照一定的順序組成一個責任鏈。當需要記錄日志時,請求會沿著責任鏈傳遞,每個處理器都可以選擇是否記錄日志以及記錄的方式和內容。
3.異常處理:將不同類型的異常處理邏輯分別封裝到不同的處理器中,并按照一定的順序組成一個責任鏈。當系統出現異常時,請求會沿著責任鏈傳遞,每個處理器都可以選擇是否處理該異常以及如何處理。
4.數據校驗:將不同類型的校驗邏輯封裝到不同的處理器中,并按照一定的順序組成一個責任鏈。當用戶輸入數據時,請求會沿著責任鏈傳遞,每個處理器都可以選擇是否校驗該數據以及如何校驗。
5.請求過濾:將不同類型的過濾邏輯封裝到不同的處理器中,并按照一定的順序組成一個責任鏈。當請求到達時,請求會沿著責任鏈傳遞,每個處理器都可以選擇是否過濾該請求以及如何過濾。

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

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

相關文章

【Excel】單元格如何設置可選項、固定表頭

設置可選項 固定表頭:視圖---凍結窗口

c++ 線程安全與線程管理

C11引入了標準庫中的多線程支持,包括std::thread類和各種同步機制 互斥鎖std::mutex : 互斥鎖用于保護共享資源,確保同一時間只有一個線程能夠訪問該資源,以防止數據競爭。 條件變量std::condition_variable : 條件變…

埃特巴什碼加解密小程序

埃特巴什碼加解密小程序 這幾天在看CTF相關的課程,涉及到古典密碼學和近代密碼學還有現代密碼學。 簡單替換密碼 Atbash Cipher 埃特巴什碼(Atbash Cipher)其實可以視為下面要介紹的簡單替換密碼的特例,它使用字母表中的最后 一個字母代表第一個字母…

springboot學習01-[springboot介紹、配置文件介紹、自動配置讀取原理]

springboot介紹、配置文件介紹、自動配置讀取原理 springBoot學習代碼說明為什么java -jar springJar包后項目就可以啟動 配置文件介紹配置文件加載順序其他約定配置文件加載順序profile配置文件加載配置文件綁定類屬性通過Value的方式進行屬性注入通過ConfigurationProperties…

力扣62 不同路徑

一個機器人位于一個 m x n 網格的左上角 (起始點在下圖中標記為 “Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為 “Finish” )。 問總共有多少條不同的路徑? 輸入&…

【LC刷題】DAY16:530 501 236

【LC刷題】DAY16:530 501 236 文章目錄 【LC刷題】DAY16:530 501 236530. 二叉搜索樹的最小絕對差 [link](https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/)501.二叉搜索樹中的眾數236. 二叉樹的最近公共祖先 [link](htt…

壓縮文件夾的時候 找不到該文件或您沒有讀取該文件的權限。

在壓縮文件夾時,出現 “找不到該文件或您沒有讀取該文件的權限” 錯誤,可能有以下幾種原因和解決方法: 1. 文件不存在或路徑錯誤 檢查文件路徑:確保文件路徑正確且文件確實存在。 文件名和路徑長度:Windows 對文件路…

FedCache 2.0引領聯邦邊緣學習性能與通信效率革新

FedCache 2.0引領聯邦邊緣學習性能與通信效率革新 在今天的數字化時代,邊緣計算正迅速成為推動終端設備智能化的核心技術之一;如何在保證數據隱私的同時提高數據在網絡邊緣的處理效率和效果,已成為業界面臨的一大挑戰。最近,《Fe…

二分類問題中的性能指標【python,機器學習,算法】

平均絕對誤差(MAE) 平均絕對誤差(Mean Absolute Error, MAE)是衡量模型預測誤差的一種方法,通常用于回歸分析。它表示的是預測值與真實值之間差的絕對值的平均數。計算公式如下: M A E 1 N ∑ i 1 N ∣…

MacOS 上安裝和管理 Node.js

在 macOS 上安裝和管理 Node.js,使用 Node Version Manager (NVM) 是一種簡便且高效的方法。NVM 允許您輕松地安裝、切換和管理不同版本的 Node.js。本指南將帶您一步步完成這一過程。 步驟 1:安裝 Node Version Manager (NVM) 首先,我們需…

電巢科技CIOE中國光博會:激光雷達技術應用研討會圓滿落幕!

2024年6月20日,由CIOE中國光博會與電巢科技聯合主辦的“激光雷達技術應用”線上研討會成功舉行。本次線上研討會是CIOE中國光博會與電巢科技首次聯合主辦的論壇,旨在借助雙方自身資源優勢,為行業發展提供可靠的交流平臺。接下來,C…

Android焦點機制結合WMS

文章前提: 了解WMS基本作用了解window的概念,phoneWindow,rootViewImpl了解view的事件分發 開始: 講三件事情: window的創建,更新焦點的更新事件的分發 Window的創建,更新: wi…

基于 Redis 實現秒殺資格判斷,提升并發性能

在互聯網電商平臺上,秒殺活動往往會吸引大量用戶同時搶購,如何高效地處理高并發請求,保證用戶體驗,是一個重要的技術挑戰。本文將介紹如何基于 Redis 實現秒殺資格的判斷,提高并發性能。 基本思路 秒殺活動的核心流程…

AI 編程還有前景嘛?

自從各個大廠相繼出品 AI 編程助手之后,AI 在編程領域的發展,可謂是幾無寸進。 相比于 AI 在多模態領域火熱,AI 在編程領域的熱度已經完全下來了。 阿七在公眾號搜索了關鍵詞「AI編程」,發現搜索出來的公眾號寥寥無幾&#xff0…

LLM生成模型在生物蛋白質應用:ESM3

參考: https://github.com/evolutionaryscale/esm 通過GPT模型原理,輸入蛋白質序列等模態輸出預測的蛋白質序列及結構 使用 參考:https://colab.research.google.com/github/evolutionaryscale/esm/blob/main/examples/generate.ipynb#sc…

(六)使用統計學方法進行變量有效性測試(43道選擇題)

本文整理了使用統計學方法進行變量有效性測試相關的練習題,共43道,適用于想鞏固理論基礎的同學。來源:如荷學數據科學題庫(CDA二級-第7章)。 1) 2) 3) 4) 5)…

【無人機三維路徑規劃】基于樹木生長算法TGA實現復雜城市地形下無人機避障三維航跡規劃附Matlab代碼

% 定義無人機起始位置和目標位置 start_point [0, 0, 0]; % 起始位置 [x, y, z] target_point [100, 100, 100]; % 目標位置 [x, y, z] % 定義城市地形和障礙物信息 city_map imread(‘city_map.png’); % 城市地形圖像 obstacles [ 20, 30, 10; % 障礙物1位置 [x, y, z] …

三分之一的違規行為未被發現

Gigamon 調查顯示,隨著漏洞的針對性越來越強、越來越復雜,企業在檢測漏洞方面也面臨越來越大的困難,超過三分之一的企業表示,現有的安全工具無法在漏洞發生時檢測到它們。 隨著混合云環境變得越來越復雜,以及惡意行為…

Java 語言特定指南

Java 語言特定指南 本 Java 入門指南將教您如何使用 Docker 創建一個容器化的 Spring Boot 應用程序。在本模塊中,您將學習如何: 使用 Maven 容器化并運行一個 Spring Boot 應用程序設置本地開發環境以將數據庫連接到容器、配置調試器,并使…

篩斗數據:引領未來,以技術創新推動在線推廣新紀元

在數字化浪潮的推動下,企業在線推廣已成為市場拓展的關鍵手段。然而,在海量信息中精準定位目標用戶,有效提升轉化率,卻是一大挑戰。篩斗數據,作為一家專注于數據提取與分析的技術公司,正以其獨特的技術優勢…