Java行為型模式---責任鏈模式

責任鏈模式基礎概念

責任鏈模式(Chain of Responsibility Pattern)是一種行為型設計模式,其核心思想是將請求的發送者和接收者解耦,使多個對象都有機會處理請求。這些對象連接成一條鏈,請求沿著鏈傳遞,直到有一個對象處理它為止。責任鏈模式允許動態地組合處理者,增加系統的靈活性和可擴展性。

責任鏈模式的核心組件

  1. 抽象處理者(Handler)?- 定義處理請求的接口,通常包含一個指向下一個處理者的引用和處理請求的抽象方法。
  2. 具體處理者(ConcreteHandler)?- 實現抽象處理者接口,處理請求或轉發給下一個處理者。
  3. 客戶端(Client)?- 創建處理者鏈并向鏈頭提交請求,無需關心請求的具體處理過程。

責任鏈模式的實現

下面通過一個請假審批的例子展示責任鏈模式的實現:

// 1. 抽象處理者
abstract class Approver {protected Approver successor;  // 指向下一個處理者public void setSuccessor(Approver successor) {this.successor = successor;}// 處理請求的抽象方法public abstract void processRequest(LeaveRequest request);
}// 2. 具體處理者 - 項目經理
class ProjectManager extends Approver {@Overridepublic void processRequest(LeaveRequest request) {if (request.getDays() <= 3) {System.out.println("項目經理批準了" + request.getName() + "的" + request.getDays() + "天請假申請");} else if (successor != null) {successor.processRequest(request);  // 轉發請求}}
}// 3. 具體處理者 - 部門經理
class DepartmentManager extends Approver {@Overridepublic void processRequest(LeaveRequest request) {if (request.getDays() <= 7) {System.out.println("部門經理批準了" + request.getName() + "的" + request.getDays() + "天請假申請");} else if (successor != null) {successor.processRequest(request);  // 轉發請求}}
}// 4. 具體處理者 - CEO
class CEO extends Approver {@Overridepublic void processRequest(LeaveRequest request) {if (request.getDays() > 7) {System.out.println("CEO批準了" + request.getName() + "的" + request.getDays() + "天請假申請");} else if (successor != null) {successor.processRequest(request);  // 轉發請求}}
}// 5. 請求類
class LeaveRequest {private String name;  // 請假人姓名private int days;     // 請假天數public LeaveRequest(String name, int days) {this.name = name;this.days = days;}public String getName() {return name;}public int getDays() {return days;}
}// 6. 客戶端代碼
public class ChainOfResponsibilityPatternClient {public static void main(String[] args) {// 創建處理者Approver projectManager = new ProjectManager();Approver departmentManager = new DepartmentManager();Approver ceo = new CEO();// 組裝責任鏈projectManager.setSuccessor(departmentManager);departmentManager.setSuccessor(ceo);// 提交請求LeaveRequest request1 = new LeaveRequest("張三", 2);LeaveRequest request2 = new LeaveRequest("李四", 5);LeaveRequest request3 = new LeaveRequest("王五", 10);projectManager.processRequest(request1);projectManager.processRequest(request2);projectManager.processRequest(request3);}
}

責任鏈模式的變體

  1. 純責任鏈?- 每個處理者要么處理請求,要么完全不處理(轉發給下一個),請求必須被某個處理者處理。
  2. 不純責任鏈?- 處理者可以部分處理請求后繼續轉發,請求可能被多個處理者處理。

例如,Servlet Filter 是不純責任鏈的典型應用:

public interface Filter {void doFilter(ServletRequest request, ServletResponse response, FilterChain chain);
}public interface FilterChain {void doFilter(ServletRequest request, ServletResponse response);
}// 具體Filter實現
public class AuthFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {// 前置處理(如身份驗證)chain.doFilter(request, response);  // 轉發給下一個Filter// 后置處理(如日志記錄)}
}

責任鏈模式的應用場景

  1. 多級審批系統?- 如請假、報銷等需要多級審批的流程
  2. 事件處理機制?- 如 GUI 中的事件冒泡,一個事件可能被多個組件處理
  3. 攔截器 / 過濾器鏈?- 如 Servlet Filter、Spring Interceptor 等
  4. 請求過濾系統?- 如防火墻規則、權限驗證鏈
  5. 異常處理鏈?- 不同類型的異常由不同的處理器處理

責任鏈模式的優缺點

優點

  • 解耦發送者和接收者?- 請求的發送者無需知道哪個對象處理請求,降低耦合度
  • 動態組合處理者?- 可以在運行時動態調整處理者鏈的順序和組成
  • 符合開閉原則?- 可以輕松添加新的處理者而不修改現有代碼
  • 簡化對象職責?- 每個處理者只需關注自己的職責,提高代碼復用性
  • 增強靈活性?- 可以根據需要靈活配置處理鏈的長度和處理邏輯

缺點

  • 請求處理不確定?- 請求可能直到鏈的末尾都沒有被處理,需要設置默認處理者
  • 性能問題?- 長鏈可能影響系統性能,尤其是遞歸調用時
  • 調試困難?- 責任鏈的行為可能難以理解和調試,尤其是鏈較長時
  • 設置鏈復雜?- 客戶端需要正確配置處理鏈,否則可能導致處理異常

使用責任鏈模式的注意事項

  1. 避免循環引用?- 確保責任鏈中沒有循環引用,否則會導致無限循環
  2. 設置默認處理者?- 為鏈的末尾添加默認處理者,確保請求不被遺漏
  3. 控制鏈的長度?- 過長的鏈會降低性能,建議控制鏈的長度
  4. 考慮處理順序?- 處理者的順序可能影響請求的處理結果,需合理設計
  5. 結合其他模式?- 責任鏈模式常與組合模式結合,形成樹形責任鏈
  6. 日志記錄?- 在處理鏈中添加日志記錄,便于調試和監控

總結

責任鏈模式通過將請求的處理者組織成一條鏈,實現了請求的發送者和接收者之間的解耦。它允許動態地組合處理者,使系統更加靈活和可擴展。在實際開發中,責任鏈模式常用于多級審批、請求過濾、事件處理等場景。合理使用責任鏈模式可以提高代碼的可維護性和復用性,但需要注意鏈的長度和處理順序對系統性能的影響。

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

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

相關文章

嵌入式學習筆記- 結構體名字被賦值時是整體內容賦值

結構體變量名被賦值時&#xff0c;?不是賦值的地址&#xff0c;而是執行對整個結構體內容的復制&#xff08;值拷貝&#xff09;?直接賦值是成員級復制? 當使用 s2 s1; 形式的賦值時&#xff08;其中 s1 和 s2 是同類型結構體變量&#xff09;&#xff0c;系統會?逐成員復…

基于UDP/IP網絡游戲加速高級擁塞控制算法(示意:一)

/* ███████╗ 基于UDP/IP網絡游戲加速高級擁塞控制算法&#xff08;示意&#xff1a;一&#xff09; ███████╗ */#pragma once#include <iostream> #include <vector> #include <deque> #include <cmath> #include <algorithm> …

【YOLOv11-目標檢測】06-模型部署(C++)

上一節課,我們學習了模型的預測。那么,如何用C++部署呢? 克隆項目 進入cmd,進入自己的項目文件夾,然后git clone項目: git clone https://github.com/Geekgineer/YOLOs-CPP 進入到YOLOs-CPP文件夾: 配置環境 ONNX Runtime 后續構建項目的時候,會自動下載,因此,我…

【第零章編輯器開發與拓展】

前言&#xff1a;對編輯器拓展與開發可以節省很多時間&#xff0c;提高開發效率&#xff0c;比如技能編輯器&#xff0c;關卡編輯器這種。當然這只是編輯器開發的一些典型應用&#xff0c;它能做不止這些。學習完這個之后&#xff0c;我們可以開發項目需要的工具。我本意在編輯…

使用 mongoimport 導入本地 JSON 文件到 MongoDB 及數據查看指南

在項目中&#xff0c;我們經常需要將本地 JSON 文件批量導入 MongoDB 數據庫。本文以 Ubuntu 22.04 環境為例&#xff0c;詳細記錄了如何安裝 mongoimport 工具、正確導入多個 JSON 文件&#xff0c;以及查看導入后的數據。一、環境介紹操作系統&#xff1a;Ubuntu 22.04.5 LTS…

新手向:Python數據處理Excel報表自動化生成與分析

Python實現Excel報表自動化系統全流程指南本文將詳細介紹如何使用Python實現一個完整的Excel報表自動化系統&#xff0c;涵蓋從數據清洗、分析到可視化報表生成的全流程。本教程面向Python初學者&#xff0c;通過實際案例講解pandas和openpyxl庫的核心用法。系統概述Excel報表自…

【第六節】docker可視化工具portainer安裝

該文章參考了這篇文章https://zhuanlan.zhihu.com/p/27740131259portainer是一個基于網頁的docker可視化管理工具&#xff0c;試想一下我們怎么登錄路由器管理界面的&#xff0c;異曲同工。那么就需要在服務器的docker內安裝portainer&#xff0c;然后在我們的開發機或者說工作…

使用 Certbot 申請和自動續簽 Let’s Encrypt 的免費 SSL 證書

一. Let’s Encrypt 介紹 Let’s Encrypt 是當前最常用的免費 HTTPS 證書生成工具之一。該服務由非營利組織提供&#xff0c;致力于為全球范圍內的網站提供便捷的自動化證書頒發服務。雖然 Let’s Encrypt 證書的有效期只有90天&#xff0c;但是可以自動續期&#xff0c;這使得…

【kubernetes】--controller(DaemonSet)

Kubernetes DaemonSet 控制器詳解 它確保集群中所有(或部分)節點上都運行一個 Pod 的副本。當有新節點加入集群時&#xff0c;DaemonSet 會自動在新節點上創建 Pod&#xff1b;當節點從集群中移除時&#xff0c;這些 Pod 也會被垃圾回收。 DaemonSet 的核心特性 每個節點一個 P…

內測分發平臺應用的異地容災和負載均衡處理和實現思路

內測分發平臺應用的異地容災和負載均衡處理和實現思路如下&#xff1a;一、異地容災1.風險評估和需求分析&#xff1a;對現有的IT基礎設施進行全面的風險評估和需求分析&#xff0c;評估潛在風險和災害的可能性&#xff0c;以及確定業務和數據的關鍵性。2.設計備份架構&#xf…

【Vue】瀏覽器緩存 sessionStorage、localStorage、Cookie

嘿&#xff0c;各位 Vue 開發者們&#xff01;今天咱們來好好聊聊瀏覽器里的三種緩存方式&#xff1a;sessionStorage、localStorage 和 Cookie。在實際開發中&#xff0c;合理運用這些緩存能讓我們的應用性能大幅提升&#xff0c;同時避免一些不必要的問題。下面就跟著我的筆記…

c#如何將不同類型的數據存儲到一起

在 C# 中&#xff0c;存儲不同類型的數據有多種方式&#xff0c;具體選擇取決于你的需求&#xff08;類型安全、性能、靈活性等&#xff09;。以下是常見的解決方案及其適用場景&#xff1a;1. 使用 object 類型&#xff08;裝箱 / 拆箱&#xff09;將所有數據轉換為基類 objec…

超唯美治愈風卡通插畫PPT模版

海洋卡通風治愈系PPT模版&#xff0c;兒童可愛治愈可愛PPT模版&#xff0c;治愈風商務通用PPT模版&#xff0c;治愈系課件PPT模版&#xff0c;治愈風插畫PPT模版&#xff0c;超唯美治愈風PPT模版&#xff0c;可愛插畫治愈系女孩PPT模版 超唯美治愈風卡通插畫PPT模版&#xff1a…

el-tooltip 快速滾動的時候出現殘影如何解決 vue3

<el-tooltip:disabled"isScrolling" <!-- 新增滾動狀態綁定 -->:popper-options"{ modifiers: [{ name: computeStyles, options: { adaptive: false }] }"effect"dark":content"label.name"placement"right-start"…

【經典面經】C++新特性 TCP完整收發數據 TLS1.2 TLS1.3

文章目錄cpp新特性C11C14C17C20tcp如何保證完整收發數據結論1. **面向連接的三次握手**2. **字節序號與確認機制**3. **校驗和&#xff08;Checksum&#xff09;**4. **超時重傳與快速重傳**5. **滑動窗口&#xff08;流量控制&#xff09;**6. **數據重組與排序**7. **四次揮手…

Spring AI 系列之十一 - RAG-進階RetrievalAugmentationAdvisor

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

[TOOL] ubuntu 使用 ffmpeg 操作 gif、mp4

文章目錄一、工具安裝二、gif 轉mp4三、mp4 兩倍速一、工具安裝 安裝 ffmpeg 工具&#xff1a; sudo apt install ffmpeg二、gif 轉mp4 1. 配置環境 核心指令: ffmpeg -i input.mp4 -filter_complex "[0:v]setpts0.5*PTS[v];[0:a]atempo2.0[a]" -map "[v]&q…

linux中INIT_MM_CONTEXT宏對pgd的重復賦值

在GNU C中&#xff0c;支持通過標號元素對指定結構體成員名進行初始化&#xff0c;這允許初始化值以任意順序出現。在linux內核中對init_mm初始化時有如下代碼。#define INIT_MM_CONTEXT(name) \.pgd init_pg_dir,struct mm_struct init_mm {.mm_rb RB_ROOT,.pgd swapper…

第十五章 STL(stack、queue、list、set、map容器使用)

棧stack使用&#xff1a;隊列queue雙向循環鏈表listlist構造函數list 賦值和交換list 大小操作list 插入和刪除list 數據存取list 反轉和排序排序算法sort降序操作排序案例#include<iostream> using namespace std; #include<list>class Person { private:string n…

【論文閱讀】HCCF:Hypergraph Contrastive Collaborative Filtering

論文出處&#xff1a;SIGIR 2022 CCF-A 論文地址&#xff1a;Hypergraph Contrastive Collaborative Filtering 論文代碼&#xff1a;akaxlh/HCCF: HCCF, SIGIR 2022 目錄 摘要 介紹 研究背景與核心問題 現有方法局限性 HCCF的創新解決方案 技術優勢 定義與相關工作 …