設計模式9-責任鏈模式

定義

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

優勢

  • 解耦請求發送者與接收者,發送者無需知道具體由哪個對象處理請求;

  • 新增處理者時只需加入鏈條,無需修改原有代碼,符合 “開閉原則”。

場景

生活場景

最典型的例子是?公司請假審批流程:

  • 請假 1 天以內:組長直接審批;

  • 請假 1-3 天:組長無權處理,傳遞給部門經理審批;

  • 請假 3 天以上:部門經理無權處理,傳遞給總經理審批。

這里,組長→部門經理→總經理形成一條 “責任鏈”,請假請求會沿著鏈條傳遞,直到被對應的負責人處理。

Java 中的責任鏈場景

  1. Servlet Filter 鏈:
    客戶端請求經過多個 Filter(過濾器)處理(如編碼過濾、權限校驗、日志記錄等),每個 Filter 可選擇處理請求后傳遞給下一個 Filter,或直接終止請求。

  2. Spring Interceptor 鏈:
    Spring MVC 中的攔截器鏈,對請求進行預處理(如登錄驗證)、后處理(如數據封裝),每個 Interceptor 可決定是否繼續傳遞請求。

  3. 異常處理機制:
    Java 的異常捕獲(try-catch)本質上也是責任鏈:異常會從發生處向上傳遞,直到被第一個匹配的 catch 塊處理。

代碼

// 抽象審批者類:定義責任鏈節點的通用行為
abstract class Approver {protected Approver nextApprover; // 下一個審批者(責任鏈的下一個節點)// 設置下一個審批者public void setNextApprover(Approver nextApprover) {this.nextApprover = nextApprover;}// 抽象處理方法:子類需實現具體審批邏輯public abstract void handleRequest(LeaveRequest request);
}// 請假請求類:封裝請求信息class LeaveRequest {private String name; // 申請人姓名private int days; // 請假天數public LeaveRequest(String name, int days) {this.name = name;this.days = days;}// getter方法public String getName() {return name;}public int getDays() {return days;}
}// 組長:處理1天以內的請假class GroupLeader extends Approver {@Overridepublic void handleRequest(LeaveRequest request) {if (request.getDays() <= 1) {System.out.println("組長批準 " + request.getName() + " 請假" + request.getDays() + "天");} else {// 超過權限,傳遞給下一個審批者if (nextApprover != null) {nextApprover.handleRequest(request);}}}
}// 總經理:處理3天以上的請假
class GeneralManager extends Approver {@Overridepublic void handleRequest(LeaveRequest request) {if (request.getDays() > 3) {System.out.println("總經理批準 " + request.getName() + " 請假" + request.getDays() + "天");} else {// 超過權限,傳遞給下一個審批者(此處為鏈的終點,可省略)if (nextApprover != null) {nextApprover.handleRequest(request);}}}
}// 部門經理:處理1-3天的請假class DeptManager extends Approver {@Overridepublic void handleRequest(LeaveRequest request) {if (request.getDays() > 1 && request.getDays() <= 3) {System.out.println("部門經理批準 " + request.getName() + " 請假" + request.getDays() + "天");} else {// 超過權限,傳遞給下一個審批者if (nextApprover != null) {nextApprover.handleRequest(request);}}}
}// 測試類:構建責任鏈并模擬請假請求
class Client {public static void main(String[] args) {// 創建審批者Approver groupLeader = new GroupLeader();Approver deptManager = new DeptManager();Approver generalManager = new GeneralManager();// 構建責任鏈:組長→部門經理→總經理groupLeader.setNextApprover(deptManager);deptManager.setNextApprover(generalManager);// 模擬請假請求LeaveRequest request1 = new LeaveRequest("張三", 1); // 1天:組長處理LeaveRequest request2 = new LeaveRequest("李四", 2); // 2天:部門經理處理LeaveRequest request3 = new LeaveRequest("王五", 5); // 5天:總經理處理// 發送請求(從鏈的起點開始)groupLeader.handleRequest(request1);groupLeader.handleRequest(request2);groupLeader.handleRequest(request3);}
}

責任鏈模式代碼

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

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

相關文章

使用JAVA制作minecraft紅石和創造模式插件

這一次主要是紅石和創造模式的新加入由于代碼較長&#xff0c;所以呃這一段代碼就直接勞煩各位呃插進之前的3.0版本里面!!!!!!!!!import org.lwjgl.*; import org.lwjgl.glfw.*; import org.lwjgl.opengl.*; import org.lwjgl.system.*;import java.nio.*; import java.util.*;…

Git 版本管理核心實踐與問題解決手冊

Git 的核心價值版本控制&#xff1a;完整記錄所有修改歷史&#xff0c;支持隨時回退到任意歷史版本團隊協作&#xff1a;允許多開發者同時工作&#xff0c;有效避免代碼沖突和覆蓋問題高效分支&#xff1a;通過分支隔離功能開發與穩定主線&#xff0c;保持項目穩定性變更追溯&a…

hadoop安欣醫院掛號看診管理系統(代碼+數據庫+LW)

摘 要 隨著信息技術的飛速發展&#xff0c;醫療服務行業正逐步向信息化、智能化轉型。安欣醫院掛號看診管理系統正是基于這一背景開發的一款集掛號、看診管理于一體的綜合性系統。本系統采用Hadoop大數據處理技術&#xff0c;旨在提高醫院掛號看診的效率&#xff0c;優化醫療…

【PHP】數學/數字處理相關函數匯總,持續更新中~

目錄 一、取整 二、向上取整 三、向下取整 四、四舍五入取整 五、四舍五入保留小數點 六、浮點數值 七、絕對值 八、生成隨機數 九、數字格式化&#xff08;以千位分割&#xff09; 十、對除法結果取整 十一、返回除法的余數 十二、是否為數字或數字字符串 十三、…

防火墻技術(二):安全區域

安全區域和接口 默認情況下&#xff0c;報文在不同安全區域之間流動時受到控制&#xff0c;報文在同一個安全區域內流動時不受控制。但華為防火墻也支持對同一個安全區域內流動的報文控制&#xff0c;通過安全策略來實現防火墻通過接口來連接網絡&#xff0c;將接口劃分到安全區…

銀河麒麟V10(Phytium,D2000/8 E8C, aarch64)開發Qt

搞了一臺國產計算機&#xff0c;銀河麒麟V10系統 首先查看系統構架 kylinkylin-pc:/data$ uname -m aarch64 是arm架構的&#xff0c;到 https://www.qt.io/download-qt-installer下載 qt-online-installer-linux-arm64-4.10.0.run

騰訊云 MCP 場景征集計劃 | 你的方案,正在定義開發新范式

開發者的進階正在從“寫代碼”走向“做場景”。MCP&#xff08;模型上下文協議&#xff09;讓你以更低心智負擔撬動云AI能力&#xff0c;把時間花在真正的業務價值上。騰訊云開發者MCP廣場 正式啟動「騰訊云 MCP 場景征集計劃」&#xff0c;尋找最懂 MCP 的你&#xff1a;將真實…

21款m1 max升級到macOS 13——Ventura

macOS系統體驗&#xff1a;之前入手的m1 max出廠版本的macOS系統是macOS Monterey&#xff0c;也就是macOS 12&#xff0c;用了一段時間后&#xff0c;其實也是很流暢的&#xff0c;無奈最近vscode上的某插件一直提醒我的macOS系統版本過低。索性升級了一下macOS系統了。macOS系…

PostgreSQL WAL機制深度解析與優化

PostgreSQL 的預寫日志&#xff08;Write-Ahead Logging, WAL&#xff09; 是其事務持久化和數據完整性的核心機制&#xff0c;通過“先寫日志&#xff0c;再寫數據”的原則保障故障恢復能力。以下是深度解析&#xff1a;一、WAL 的核心目標 崩潰恢復&#xff08;Crash Recover…

三重積分的性質

文章目錄前言幾何意義性質先 1 后 2 投影法先 2 后 110.13前言 規律作息。 幾何意義 三重積分&#xff0c;只要被積分函數是正的&#xff0c;那么&#xff0c;積分的結果就是質量。可能工作還是太累了&#xff0c;以后有時間可以買買彩票&#xff0c;碰碰運氣。。。。 性質…

每日Java并發面試系列(5):基礎篇(線程池的核心原理是什么、線程池大小設置為多少更合適、線程池哪幾種類型?ThreadLocal為什么會導致內存泄漏?)

1. 什么是線程池&#xff1f;它的核心原理是什么&#xff1f;什么是線程池&#xff1f; 線程池是一種基于池化思想管理和使用線程的機制。它內部維護了多個線程&#xff0c;等待著分配由用戶提交的并發執行的任務。這避免了頻繁創建和銷毀線程帶來的開銷&#xff0c;從而提高了…

京東商品詳情API返回值應用實踐

一、API核心功能京東商品詳情API&#xff08;如jd.item.get或jd.union.open.goods.query&#xff09;是京東開放平臺提供的核心接口&#xff0c;用于通過商品ID&#xff08;skuId&#xff09;或店鋪ID檢索指定商品的詳細信息。該接口支持獲取商品基礎信息、價格、庫存、規格參數…

學習python第14天

匯報一下秋招進度&#xff0c;字節一面完后9天都沒給回復&#xff0c;大概率被掛了&#xff0c;但是官網還在流程中&#xff0c;我又沒有HR聯系方式&#xff0c;所以直接在平臺上反饋了&#xff0c;要么趕緊給我過&#xff0c;要么趕緊給我掛&#xff0c;耽誤時間。阿里國際一面…

監聽nacos配置中心數據的變化

RefreshScope實現nacos配置中心數據的動態刷新。如果需要監聽nacos配置中心數據的變化&#xff0c;并執行對應的業務邏輯&#xff0c;則可以使用NacosConfigListener注解。除了需要導入微服務和nacos配置中心的jar&#xff0c;還需要額外導入如下的jar&#xff1a;<dependen…

docker搭建Apisix和Apisix Dashboard

第一步&#xff1a;github下載源碼 參考&#xff1a;https://apisix.apache.org/zh/docs/apisix/installation-guide/ git clone https://github.com/apache/apisix-docker.git cd apisix-docker/example第二步&#xff1a;添加Apisix Dashboard鏡像 打開./apisix-docker/examp…

ubuntu 安裝conda, ubuntu24安裝miniConda

1. 官網下載腳本&#xff1a; Download Success | Anaconda 我選的mini版本&#xff0c;也可以選左邊的完整版 2. 下載后&#xff0c;上傳至服務器/opt下 3. 執行腳本安裝&#xff1a; sh Miniconda3-latest-Linux-x86_64.sh 4. 需要按照英文提示&#xff0c;輸入回車&#…

現代貪吃蛇游戲的進化:從經典玩法到多人在線體驗

Hi&#xff0c;我是前端人類學&#xff08;之前叫布蘭妮甜&#xff09;&#xff01; 貪吃蛇游戲自1976年誕生以來&#xff0c;已經從簡單的像素游戲發展成為具有豐富功能的現代游戲體驗。本文將通過一個功能增強版的貪吃蛇游戲&#xff0c;探討如何將經典游戲概念與現代Web技術…

加速智能經濟發展:如何助力“人工智能+”戰略在實時視頻領域的落地

2025年8月&#xff0c;國務院發布了《關于深入實施“人工智能”行動的意見》&#xff08;國發〔2025〕11號&#xff09;&#xff0c;明確提出&#xff0c;到2030年&#xff0c;我國將在人工智能技術的推動下全面邁入智能經濟與智能社會的新階段。政策強調&#xff0c;要通過推動…

從 WPF 到 Avalonia 的遷移系列實戰篇1:依賴屬性的異同點與遷移技巧

從 WPF 到 Avalonia 系列實戰篇1&#xff1a;依賴屬性的異同與實踐&#xff08;基于 BlinkingButton 控件&#xff09; 我的GitHub倉庫Avalonia學習項目包含完整的Avalonia實踐案例與代碼對比。 我的gitcode倉庫是Avalonia學習項目。 文中主要示例代碼均可在倉庫中查看&#xf…

基于開源AI大模型AI智能名片S2B2C商城小程序的產地優勢產品銷售策略研究

摘要&#xff1a;本文聚焦于在開源AI大模型AI智能名片S2B2C商城小程序的商業生態中&#xff0c;探討如何利用產地優勢進行產品銷售。通過分析不同產品類別的產地優勢&#xff0c;如阿膠類選東阿、海參類選沿海、紅酒類選海外等&#xff0c;結合開源AI大模型的技術支持、AI智能名…