【設計模式】責任鏈模式

顧名思義,責任鏈模式(Chain of Responsibility Pattern)為請求創建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬于行為型模式。

在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。

介紹

意圖:避免請求發送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止。

主要解決:職責鏈上的處理者負責處理請求,客戶只需要將請求發送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞,所以職責鏈將請求的發送者和請求的處理者解耦了。

何時使用:在處理消息的時候以過濾很多道。

如何解決:攔截的類都實現統一接口。

關鍵代碼:Handler 里面聚合它自己,在 HandlerRequest 里判斷是否合適,如果沒達到條件則向下傳遞,向誰傳遞之前 set 進去。

應用實例:?1、紅樓夢中的"擊鼓傳花"。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 對 Encoding 的處理,Struts2 的攔截器,jsp servlet 的 Filter。

優點:?1、降低耦合度。它將請求的發送者和接收者解耦。 2、簡化了對象。使得對象不需要知道鏈的結構。 3、增強給對象指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任。 4、增加新的請求處理類很方便。

缺點:?1、不能保證請求一定被接收。 2、系統性能將受到一定影響,而且在進行代碼調試時不太方便,可能會造成循環調用。 3、可能不容易觀察運行時的特征,有礙于除錯。

使用場景:?1、有多個對象可以處理同一個請求,具體哪個對象處理該請求由運行時刻自動確定。 2、在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。 3、可動態指定一組對象處理請求。

注意事項:在 JAVA WEB 中遇到很多應用。

實現

我們創建抽象類?AbstractLogger,帶有詳細的日志記錄級別。然后我們創建三種類型的記錄器,都擴展了?AbstractLogger。每個記錄器消息的級別是否屬于自己的級別,如果是則相應地打印出來,否則將不打印并把消息傳給下一個記錄器。

責任鏈模式的 UML 圖

步驟 1

創建抽象的記錄器類。

AbstractLogger.java

public abstract class AbstractLogger {public static int INFO = 1;public static int DEBUG = 2;public static int ERROR = 3;protected int level;//責任鏈中的下一個元素protected AbstractLogger nextLogger;public void setNextLogger(AbstractLogger nextLogger){this.nextLogger = nextLogger;}public void logMessage(int level, String message){if(this.level <= level){write(message);}if(nextLogger !=null){nextLogger.logMessage(level, message);}}abstract protected void write(String message);}

步驟 2

創建擴展了該記錄器類的實體類。

ConsoleLogger.java

public class ConsoleLogger extends AbstractLogger {public ConsoleLogger(int level){this.level = level;}@Overrideprotected void write(String message) {    System.out.println("Standard Console::Logger: " + message);}
}

ErrorLogger.java

public class ErrorLogger extends AbstractLogger {public ErrorLogger(int level){this.level = level;}@Overrideprotected void write(String message) {    System.out.println("Error Console::Logger: " + message);}
}

FileLogger.java

public class FileLogger extends AbstractLogger {public FileLogger(int level){this.level = level;}@Overrideprotected void write(String message) {    System.out.println("File::Logger: " + message);}
}

步驟 3

創建不同類型的記錄器。賦予它們不同的錯誤級別,并在每個記錄器中設置下一個記錄器。每個記錄器中的下一個記錄器代表的是鏈的一部分。

ChainPatternDemo.java

public class ChainPatternDemo {private static AbstractLogger getChainOfLoggers(){AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);errorLogger.setNextLogger(fileLogger);fileLogger.setNextLogger(consoleLogger);return errorLogger;  }public static void main(String[] args) {AbstractLogger loggerChain = getChainOfLoggers();loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");loggerChain.logMessage(AbstractLogger.DEBUG, "This is a debug level information.");loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information.");}
}

步驟 4

執行程序,輸出結果:

Standard Console::Logger: This is an information.
File::Logger: This is a debug level information.
Standard Console::Logger: This is a debug level information.
Error Console::Logger: This is an error information.
File::Logger: This is an error information.
Standard Console::Logger: This is an error information.

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

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

相關文章

移動端預覽指定鏈接的pdf文件流

場景 直接展示外部系統返回的獲取文件流時出現了跨域問題&#xff1a; 解決辦法 1. 外部系統返回的請求頭中調整&#xff08;但是其他系統不會給你改的&#xff09; 2. 我們系統后臺獲取文件流并轉為新的文件流提供給前端 /** 獲取傳入url文件流 */ GetMapping("/get…

Java 正則表達式【非貪婪匹配、格式驗證、反向引用、API】

非貪婪匹配 非貪婪匹配的元字符是問號 ? 當此字符跟在任何其他限定符&#xff08;*、、&#xff1f;、{n}、{m}、{n,m}&#xff09;之后&#xff0c;匹配模式是 "非貪心的"。非貪心的意思就是每次匹配搜索到的盡可能短的字符串&#xff0c;可以是0個。 案例 對…

30 | 中國高校數據分析

一、數據源 本項目使用了兩個csv的數據文件,一個是中國高校(大學)的數據,一個是中國高校專業設置的數據 數據基本欄位:高校(大學)的數據高校專業設置的數據學校學校省份專業類別城市專業名稱地址國家特色專業水平層次辦學類別辦學類型985211雙一流二、數據分析目標 本…

電腦打開對話框中沒有桌面這個選項解決辦法

問題描述&#xff1a; 左側欄中的桌面圖標不顯示 解決方法&#xff1a; 左側的空白處右鍵-顯示所有的文件夾 這時所有的文件夾都顯示了&#xff01;

從魯大師十五年,尋找軟件的生存法則

千禧之年&#xff0c;國內互聯網用戶數量首次突破1000萬大關&#xff0c;互聯網的騰飛正式拉開序幕。 從彼時算起&#xff0c;中國互聯網發展也不過23年&#xff0c;而我們記憶中那個搖著蒲扇的老頭&#xff0c;卻占據了其中關鍵的十五年。 這十五年中有太多曾經為人熟知的軟件…

pointpillars怎么查看tensorboard

在PointPillars中使用TensorBoard來可視化訓練過程和模型性能是很常見的做法。TensorBoard是TensorFlow提供的一個強大的工具&#xff0c;用于可視化訓練過程、模型圖、損失曲線、準確率等。下面是在PointPillars中使用TensorBoard的一般步驟&#xff1a; 請注意&#xff0c;上…

CHATGPT源碼簡介與使用指南

CHATGPT源碼的基本介紹 CHATGPT源碼備受關注&#xff0c;它是一款基于人工智能的聊天機器人&#xff0c;旨在幫助開發者快速搭建自己的聊天機器人&#xff0c;無需編寫代碼。下面是對CHATGPT搭建源碼的詳細介紹。 CHATGPT源碼的構建和功能 CHATGPT源碼是基于Google的自然語言…

flutter開發實戰-MethodChannel實現flutter與iOS雙向通信

flutter開發實戰-MethodChannel實現flutter與iOS雙向通信 最近開發中需要iOS與flutter實現通信&#xff0c;這里使用的MethodChannel 如果需要flutter與Android實現雙向通信&#xff0c;請看 https://blog.csdn.net/gloryFlow/article/details/132218837 這部分與https://bl…

Linux——基礎IO(1)

目錄 0. 文件先前理解 1. C文件接口 1.1 寫文件 1.2 讀文件 1.3 輸出信息到顯示器 1.4 總結 and stdin & stdout & stderr 2. 系統調用文件I/O 2.1 系統接口使用示例 2.2 接口介紹 2.3 open函數返回值 3. 文件描述符fd及重定向 3.1 0 & 1 & 2 3.2…

【Spring Cloud Alibaba】RocketMQ的基礎使用,如何發送消息和消費消息

在現代分布式架構的開發中&#xff0c;消息隊列扮演著至關重要的角色&#xff0c;用于解耦系統組件、保障可靠性以及實現異步通信。RocketMQ作為一款開源的分布式消息中間件&#xff0c;憑借其高性能、高可用性和良好的擴展性&#xff0c;成為了眾多企業在構建高可靠性、高吞吐…

運維面試大全

文章目錄 第一階段平常怎么處理故障,思路是什么樣的公網和私網分類以及范圍,本機地址,網絡地址,廣播地址交換機的工作原理ICMP是什么干什么用的,它有哪些命令TCP和UDP協議的區別tcp有哪些控制位,分別是什么意思你是用過哪些Linux命令Linux 系統安全優化與內核優化經常使用…

stable diffusion 單張圖片換頭roop安裝配置

1.首先安裝秋葉大佬的webui 2.然后在拓展里面搜索roop,下載roop插件,然后重啟webui 3.重啟后,在文生圖和圖生圖的界面,就可以看到roop的入口 4.這里面,需要提前安裝Visual Studio. 勾選一些必要的選項,這里可以參照b站的視頻 # 秋葉版本Stablediffusion的Roop插件的安裝 …

JavaScript reduce深入了解

reduce() 是 JavaScript 數組的一個高階函數&#xff0c;它允許你將數組中的元素按順序依次合并為一個單一的值。reduce() 可以用于數組求和、計算平均值、連接字符串等各種情況。它的工作原理是通過迭代數組的每個元素&#xff0c;然后將元素和累加器進行某種操作&#xff0c;…

使用 Python 在 NLP 中進行文本預處理

一、說明 自然語言處理 &#xff08;NLP&#xff09; 是人工智能 &#xff08;AI&#xff09; 和計算語言學的一個子領域&#xff0c;專注于使計算機能夠理解、解釋和生成人類語言。它涉及計算機和自然語言之間的交互&#xff0c;允許機器以對人類有意義和有用的方式處理、分析…

Java # JVM內存管理

一、運行時數據區域 程序計數器、Java虛擬機棧、本地方法棧、Java堆、方法區、運行時常量池、直接內存 二、HotSpot虛擬機對象 對象創建&#xff1a; 引用檢查類加載檢查分配內存空間&#xff1a;指針碰撞、空閑列表分配空間初始化對象信息設置&#xff08;對象頭內&#xff0…

?可視化繪圖技巧100篇進階篇(五)-階梯線圖(Step Chart)

目錄 前言 圖表類型特征 適用場景 圖例 繪圖工具及代碼實現 ECharts SMARTBI

安卓中常見的字節碼指令介紹

問題背景 安卓開發過程中&#xff0c;經常要通過看一些java代碼對應的字節碼&#xff0c;來了解java代碼編譯后的運行機制&#xff0c;本文將通過一個簡單的demo介紹一些基本的字節碼指令。 問題分析 比如以下代碼&#xff1a; public class test {public static void main…

Java課題筆記~ JSP編程

4.1 JSP基本語法 JSP (全稱Java Server Pages) 是由 Sun Microsystems 公司倡導和許多公司參與共同創建的一種使軟件開發者可以響應客戶端請求&#xff0c;而動態生成 HTML、XML 或其他格式文檔的Web網頁的技術標準。 JSPHTMLJava JSP的本質是Servlet 訪問JSP的時候&#x…

【設計模式】原型模式

原型模式&#xff08;Prototype Pattern&#xff09;是用于創建重復的對象&#xff0c;同時又能保證性能。這種類型的設計模式屬于創建型模式&#xff0c;它提供了一種創建對象的最佳方式之一。 這種模式是實現了一個原型接口&#xff0c;該接口用于創建當前對象的克隆。當直接…

javaScript:數組的認識與使用以及相關案例

目錄 一.前言 二.數組 1.認識 2.數組的聲明 1.let arr [1,2,3,4] 2.結合構造函數&#xff0c;創建數組 注意&#xff1a; 3.數組長度的設置和獲取 注意 4.刪除數組元素 5.清空數組 三.獲取數組元素 獲取數組元素的幾種方法 1.使用方括號 [] 訪問元素&#xff1…