23種設計模式-行為型模式-責任鏈

文章目錄

  • 簡介
  • 問題
  • 解決
  • 代碼
    • 核心改進點:
  • 總結

簡介

責任鏈是一種行為設計模式,允許你把請求沿著處理者鏈進行發送。收到請求后,每個處理者均可對請求進行處理,或將其傳遞給鏈上的下個處理者。

問題

假如你正在開發一個訂單系統。 你希望限制系統訪問,只允許認證用戶創建訂單。 而管理員擁有所有訂單的完全訪問權限。
按照一般的開發思路,你會依次執行這些檢查。 只要接收到包含用戶憑據的請求,系統就可以嘗試認證。 如果認證失敗, 那就沒有必要再進行后續檢查了。如下圖。
請求必須經過一系列認證檢查后才能由訂單系統來處理
接著,關于認證檢查的需求越來越多。比如為了不讓原始數據直接傳遞到訂單系統,需要在認證之后清理請求中的數據;比如為了對暴力密碼破解或者爬蟲請求進行限流,又需要在認證之后增加過濾來自同一 IP 地址的重復請求邏輯;比如為了提高系統響應速度,降低系統負載,又需要在請求發送給系統之前檢查有沒有緩存結果,如果沒有才會把請求發送給系統。如下圖,這部分邏輯就會越來越多,越來越混亂。
代碼變得越來越多, 也越來越混亂
而且,修改某個檢查步驟可能也會影響其他的檢查步驟。 尤其是當你希望復用這些檢查步驟來保護其他系統時,你只能復制部分代碼, 因為這些系統只需要部分檢查步驟。

解決

與許多其他行為設計模式一樣, 責任鏈會把 特定行為轉換成 叫做處理者的獨立對象。 在上面示例里, 每個檢查步驟都可以被抽取成僅有單個方法的類, 并執行檢查操作。 請求和對應數據會被作為參數傳遞給這個方法。

這個模式建議你把這些處理者連成一條鏈。 鏈上的每個處理者都有一個成員變量來保存對于下一個處理者的引用。 除了處理請求外, 處理者還負責沿著鏈傳遞請求。 請求會在鏈上移動, 直到所有處理者都有機會對他進行處理。
更重要的是: 處理者可以決定不再沿著鏈傳遞請求, 這就可以高效地取消所有后面的處理步驟。
在我們的訂單系統示例中, 處理者會在進行請求處理工作后決定要不要繼續沿著鏈傳遞請求。 如果請求中包含正確的數據, 所有處理者都會執行自己的主要行為, 無論這個行為是身份驗證還是數據緩存。

處理者依次排列, 組成一條鏈
不過還有一種稍微不同的方式 (也是更經典一種), 那就是處理者接收到請求后自己決定是否能夠對其進行處理。 如果自己能夠處理, 處理者就不再繼續傳遞請求。 因此在這種情況下, 每個請求要么最多有一個處理者進行處理, 要么沒有任何處理者進行處理。 在處理圖形用戶界面元素棧中的事件時, 這種方式非常常見。另外,其實很多設計模式都是從很早用Java寫客戶端界面引出的解決方案。

代碼

// Handler接口定義處理契約
public interface Handler {void handle(Request request) throws AuthException; 
}// BaseHandler實現鏈式傳遞邏輯
public abstract class BaseHandler implements Handler {private Handler next;public BaseHandler setNext(Handler next) {this.next = next;return this;}protected void passToNext(Request request) throws AuthException {if (next != null) next.handle(request);  // 核心鏈式調用邏輯}
}// 具體處理者1:用戶認證
class UserAuthHandler extends BaseHandler {@Overridepublic void handle(Request request) throws AuthException {if (!validateUser(request.getUserId())) {throw new AuthException("用戶未登錄");}passToNext(request);  // 驗證成功移交后續處理}
}// 具體處理者2:權限校驗 
class PermissionHandler extends BaseHandler {@Override public void handle(Request request) throws AuthException {if (!checkAdminPermission(request.getUserId())) {throw new PermissionException("權限不足");}passToNext(request);}
}// Client動態組合處理鏈
public class OrderService {private Handler chain;public OrderService() {this.chain = new UserAuthHandler().setNext(new PermissionHandler());  // 靈活配置處理順序}public void createOrder(Request request) {chain.handle(request);  // 統一入口觸發處理鏈// 執行業務邏輯...}
}

核心改進點:

  1. 解耦檢查邏輯:每個安全檢查獨立成類,通過setNext組合鏈式結構
  2. 動態擴展性:新增日志檢查僅需創建LogHandler并插入鏈中任意位置
  3. 復用性增強:在PaymentService中可重用UserAuthHandler而不需要重復驗證代碼

總結

在這里插入圖片描述

  1. (Handler)聲明了所有具體處理者的通用接口。這個接口通常只包含單個方法,用于請求處理,但有時它還會包含一個設置鏈上 下一個處理者 的方法。
  2. (Base Handler)是一個可選的類,你可以把所有處理者共用的樣本代碼放在里面。 通常情況下,這個類里定義了一個保存下個處理者引用的成員變量。客戶端可以把下個處理者傳遞給上個處理者的構造函數或用setter方法 來創建鏈。這個類還可以實現默認的處理行為: 比如確定下個處理者存在后再把請求傳遞給它。
  3. (Concrete Handlers)包含處理請求的實際代碼。每 個處理者接收到請求后,都必須決定要不要處理,以及要不要沿 著鏈傳遞請求。 處理者通常是獨立并且不可變的,需要通過構造函數一次性地獲得 所有必要的數據。
  4. (Client) 可根據程序邏輯一次性或者動態地生成鏈。 需要注意一下,請求可以發送給鏈上的任意一個處理者,不一定是第一個處理者。

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

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

相關文章

注意力機制在大語言模型中的原理與實現總結

注意力機制在大語言模型中的原理與實現總結 1. 章節介紹 在大語言模型的學習中,理解注意力機制至關重要。本章節旨在深入剖析注意力機制的原理及其在大語言模型中的應用,為構建和優化大語言模型提供理論與實踐基礎。通過回顧神經網絡基礎及傳統架構的局…

kafka消息可靠性傳輸語義

Kafka提供了多種消息傳遞語義,以適應不同的業務需求和可靠性要求。以下是Kafka消息傳輸的可靠性語義及其實現機制: 1. At Most Once(至多一次) 語義:消息可能會丟失,但不會被重復傳遞。 實現機制&#xf…

NLP高頻面試題(三十三)——Vision Transformer(ViT)模型架構介紹

Transformer架構在自然語言處理領域取得了顯著成功,激發了研究人員將其應用于計算機視覺任務的興趣。Vision Transformer(ViT)應運而生,成為圖像分類等視覺任務中的新興架構。本文將介紹ViT的基本架構、工作原理,并與傳…

Oracle數據庫數據編程SQL<3.6 PL/SQL 包(Package)>

包是Oracle數據庫中一種重要的PL/SQL程序結構,它將邏輯相關的變量、常量、游標、異常、過程和函數組織在一起,提供了更好的封裝性和模塊化。在大型項目中,可能有很多模塊,而每一個模塊又有自己的存過、函數等。而這些存過、函數默認是放在一起的,如果所有的存過函數都是放…

機器學習 分類算法

【實驗名稱】 實驗:分類算法 【實驗目的】 1.了解分類算法理論基礎 2.平臺實現算法 3. 編程實現分類算法 【實驗原理】 分類(Categorization or Classification)就是按照某種標準給對象貼標簽(label),再根據標簽來區分歸類。 【實驗環境】 OS:Ubuntu16.0…

HTML5 Canvas繪畫板項目實戰:打造一個功能豐富的在線畫板

HTML5 Canvas繪畫板項目實戰:打造一個功能豐富的在線畫板 這里寫目錄標題 HTML5 Canvas繪畫板項目實戰:打造一個功能豐富的在線畫板項目介紹技術棧核心功能實現1. 畫板初始化與工具管理2. 多樣化繪畫工具3. 事件處理機制 技術要點分析1. Canvas上下文優化…

【YOLOv8】YOLOv8改進系列(12)----替換主干網絡之StarNet

主頁:HABUO🍁主頁:HABUO 🍁YOLOv8入門改進專欄🍁 🍁如果再也不能見到你,祝你早安,午安,晚安🍁 【YOLOv8改進系列】: YOLOv8結構解讀 YOLOv8…

1Panel 面板 寶塔面板 Ubuntu 24.04

1Panel 面板 寶塔面板 Ubuntu 24.04 https://1panel.cn/ 1Panel 是一款開源的 Linux 服務器運維管理面板,它就像是給服務器配上了一個智能管家,讓我們能通過 Web 端輕松管理服務器。以往我們管理 Linux 服務器,常常需要在命令行中輸入各種復…

Node.js全局生效的中間件

目錄 1. 目錄結構 2. 代碼實現 2.1 安裝Express 2.2 app.js - 主文件 2.3 globalMiddleware.js - 全局中間件 3. 程序運行結果 4. 總結 在Node.js的Express框架中,全局生效的中間件是指應用程序啟動后,對所有請求都有效的中間件。它通常用于日志記…

WiFi(無線局域網)技術的多種工作模式

WiFi(無線局域網)技術支持多種工作模式,以滿足不同的網絡需求和應用場景。以下是主要的WiFi工作模式及其詳細說明: 1. 基礎設施模式(Infrastructure Mode) [無線接入點 (AP)]/ | \ [客戶端…

PHP 8.x:現代Web開發的性能與效率革命

隨著PHP 8.x系列的持續演進,這門誕生于1995年的“古老”語言正煥發新生。通過引入革命性的JIT編譯器、類型系統增強及一系列現代化語法特性,PHP 8.x不僅鞏固了其在Web開發領域的統治地位,更將性能與開發者體驗推向新高度。 一、JIT編譯器&am…

【扣子agent入門】搭建計算熱量工作流

一、食物熱量知識庫 1. 創建知識庫 工作空間——資源庫——創建資源>知識庫 2. 自動采集網頁數據 文本格式>在線數據 自動采集 找一個食物熱量網站進行采集。 一定要讓知識按條數分段,不然不好查詢。 二、 意圖識別節點 意圖識別(In…

腦影像分析軟件推薦 | JuSpace

目錄 1. 軟件界面 2.工具包功能簡介 3.軟件安裝注意事項 參考文獻: Dukart J, Holiga S, Rullmann M, Lanzenberger R, Hawkins PCT, Mehta MA, Hesse S, Barthel H, Sabri O, Jech R, Eickhoff SB. JuSpace: A tool for spatial correlation analyses of magne…

微信小程序喚起app

1、前提 1、app與小程序主體需一致&#xff0c;可以前往微信公眾平臺關聯。 2、小程序的場景值為1069&#xff0c;也就是得從app打開小程序&#xff0c;小程序才能喚起app。 2、vue3代碼示例 <template><view class"maxBox bgc"><button open-typ…

jarvisoj API調用 [JSON格式變XXE]

http://web.jarvisoj.com:9882/ 題目要求&#xff1a;請設法獲得目標機器 /home/ctf/flag.txt 中的flag值 抓包得到&#xff1a; POST /api/v1.0/try HTTP/1.1 Host: web.jarvisoj.com:9882 Content-Length: 36 Accept-Language: zh-CN,zh;q0.9 User-Agent: Mozilla/5.0 (W…

3. 矩陣置零

leetcode Hot 100系列 文章目錄 一、核心操作二、外層配合操作三、核心模式代碼總結 一、核心操作 根據行和列檢測出0所在位置&#xff0c;并將行和列數組的對應位置改為true如果遍歷到某一行列時&#xff0c;只要行和列數組里面有一個是true&#xff0c;就置為0 提示&#…

【接口重復請求】axios通過AbortController解決頁面切換過快,接口重復請求問題

處理網絡請求時&#xff0c;我們經常會遇到需要中途取消請求的情況&#xff0c;比如用戶在兩個tab之間反復橫跳的場景&#xff0c;如果每個接口都從頭請求到結束&#xff0c;那必然會造成很大的服務壓力。 AbortController是一個Web API&#xff0c;它提供了一個信號對象&…

C語言跳表(Skip List)算法:數據世界的“時光穿梭機”

在數據結構算法中&#xff0c;有一種算法猶如“時空穿梭機”&#xff0c;能在瞬間跨越層層障礙&#xff0c;直擊目標——它就是跳表算法。下面&#xff0c;就讓我們一起揭開跳表算法的神秘面紗&#xff0c;通過實例探究其高效與魅力。 目錄 一、跳表算法是什么&#xff1f; …

2023第十四屆藍橋杯大賽軟件賽省賽C/C++ 大學 B 組(真題題解)(C++/Java題解)

記錄刷題的過程、感悟、題解。 希望能幫到&#xff0c;那些與我一同前行的&#xff0c;來自遠方的朋友&#x1f609; 大綱&#xff1a; 1、日期統計-&#xff08;解析&#xff09;-暴力dfs&#xff08;&#x1f609;藍橋專屬 2、01串的熵-&#xff08;解析&#xff09;-不要chu…

批量將文本文件轉換為 Word/PDF/Excel/圖片等其它格式

工作中我們經常會接觸到各種格式的文本文檔&#xff0c;比如說 txt 記事本文件、json文件、HTML格式文件等等。通常也會需要將文本文件轉換為其他的格式&#xff0c;比如說將文本文件轉換為 word 格式、PDF格式或者圖片格式等等。當我們想要對文本文件格式進行批量轉換的時候&a…