設計模式簡述(十)責任鏈模式

責任鏈模式

  • 描述
    • 基本使用
    • 使用

描述

如果一個請求要經過多個類似或相關處理器的處理。
可以考慮將這些處理器添加到一個鏈上,讓請求逐個經過這些處理器進行處理。

通常,在一個業務場景下會對整個責任鏈進行初始化,確定這個鏈上有哪些Handler

關于一個handler處理請求后,請求如何流轉通常有幾種處理方式:

  • handler有匹配條件
    • 一旦匹配一個handler完成處理后直接返回 后續handler 不會處理i請求
    • 無論是否匹配都執行完整個責任鏈
  • handler沒有匹配條件
    • 這種沒有匹配條件的鏈通常是執行整個責任鏈

基本使用

這里以有條件匹配,只執行一個handler后就返回的方式舉例
匹配的條件通常包含在請求參數中,用于與每個Handler內條件匹配

這里參數就簡單定義一個類,不提抽象層了

  • 請求參數
public class HandleRequest {private String type;private Object data;public String getType() {return type;}public void setType(String type) {this.type = type;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}@Overridepublic String toString() {return "HandleRequest{" +"type='" + type + '\'' +", data=" + data +'}';}
}
  • 抽象Handler
public abstract class AbstractHandler {private AbstractHandler nextHandler;public final void handleRequest(HandleRequest request) {if (Objects.equals(handleType(), request.getType())) {this.handle(request);} else {if (this.nextHandler != null) {this.nextHandler.handleRequest(request);} else {System.out.println("請求未匹配到Handler...");}}}public void setNext(AbstractHandler handler) {this.nextHandler = handler;}protected abstract String handleType();protected abstract void handle(HandleRequest request);
}
  • 具體Handler
public class HandlerA extends AbstractHandler {@Overrideprotected String handleType() {return "typeA";}@Overrideprotected void handle(HandleRequest request) {System.out.println("HandlerA 處理請求: " + request);}
}public class HandlerB extends AbstractHandler {@Overrideprotected String handleType() {return "typeB";}@Overrideprotected void handle(HandleRequest request) {System.out.println("HandlerB 處理請求: " + request);}
}

使用

在實際使用中,可以將責任鏈的初始化動作放到具體業務類中,返回第一個Handler給調用者即可
然后將請求委托給責任鏈。

這里就直接在調用方 進行初始化

public class Sample {public static void main(String[] args) {AbstractHandler handlerA = new HandlerA();AbstractHandler handlerB = new HandlerB();handlerA.setNext(handlerB);HandleRequest request = new HandleRequest();request.setType("typeB");request.setData("data.....");handlerA.handleRequest(request);}
}

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

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

相關文章

初識數據結構——Java集合框架解析:List與ArrayList的完美結合

📚 Java集合框架解析:List與ArrayList的完美結合 🌟 前言:為什么我們需要List和ArrayList? 在日常開發中,我們經常需要處理一組數據。想象一下,如果你要管理一個班級的學生名單,或…

ReFormX:現代化的 React 表單解決方案 - 深度解析與最佳實踐

ReFormX文檔 表單開發一直是前端工作中最繁瑣卻又最常見的任務之一。從簡單的登錄表單到復雜的多步驟配置頁面,開發者往往需要編寫大量重復代碼,處理繁瑣的狀態管理、數據驗證和聯動邏輯。ReFormX 應運而生,它不僅是一個表單組件庫&#xff…

WinForm真入門(9)——RichTextBox控件詳解

WinForm中RichTextBox控件詳解:從基礎到高級應用 上一文中筆者重點介紹了TextBox控件的詳細用法,忘記的 請點擊WinForm真入門(8)——TextBox控件詳解,那么本文中的RichTextBox與TextBox有什么區別嗎,光看名字的話,多了…

Draw.io 全面解析與競品分析:圖表繪制工具的深度對比

目錄 一、Draw.io 全面介紹 1. 產品概述 2. 核心功能特點 3. 用戶體驗 4. 商業模式 二、市場競品分析 1. 主要競品概覽 2. 深度功能對比 3. 價格策略對比 4. 技術架構對比 三、用戶場景與選擇建議 1. 不同場景下的工具推薦 2. 未來發展趨勢 四、結論 diagrams.net…

kafka分區策略詳解

Kafka 分區策略詳解 Kafka 的分區策略決定了消息在生產者端如何分配到不同分區,以及在消費者端如何動態分配分區以實現負載均衡。以下是 Kafka 核心分區策略及其適用場景的詳細解析: 1、生產者分區策略 生產者負責將消息發送到 Topic 的特定分區&#…

C++ STL 詳解 ——list 的深度解析與實踐指南

在 C 的標準模板庫(STL)中,list作為一種重要的序列式容器,以其獨特的雙向鏈表結構和豐富的操作功能,在許多編程場景下發揮著關鍵作用。深入理解list的特性與使用方法,能幫助開發者編寫出更高效、靈活的代碼…

GenerationMixin概述

類 類名簡單說明GenerateDecoderOnlyOutput繼承自 ModelOutput,適用于非束搜索方法的解碼器-only模型輸出類。GenerateEncoderDecoderOutput繼承自 ModelOutput,適用于非束搜索方法的編碼器-解碼器模型輸出類。GenerateBeamDecoderOnlyOutput繼承自 Mod…

【備賽】藍橋杯嵌入式實現led閃爍

原理 由于藍橋杯的板子帶有鎖存器,并且與lcd屏幕有沖突,所以這個就成了考點。 主要就是用定時器來實現,同時也要兼顧lcd的沖突。 一、處理LCD函數 首先來解決與lcd屏幕沖突的問題,把我們所有用到的lcd函數改裝一下。 以下是基…

C++ 并發性能優化實戰:提升多線程應用的效率與穩定性

🧑 博主簡介:CSDN博客專家、CSDN平臺優質創作者,獲得2024年博客之星榮譽證書,高級開發工程師,數學專業,擁有高級工程師證書;擅長C/C、C#等開發語言,熟悉Java常用開發技術&#xff0c…

Python----計算機視覺處理(Opencv:道路檢測之車道線擬合)

完整版: Python----計算機視覺處理(Opencv:道路檢測完整版:透視變換,提取車道線,車道線擬合,車道線顯示) 一、獲取左右車道線的原始位置 導入模塊 import cv2 import numpy as np from matplot…

優選算法的妙思之流:分治——歸并專題

專欄:算法的魔法世界 個人主頁:手握風云 目錄 一、歸并排序 二、例題講解 2.1. 排序數組 2.2. 交易逆序對的總數 2.3. 計算右側小于當前元素的個數 2.4. 翻轉對 一、歸并排序 歸并排序也是采用了分治的思想,將數組劃分為多個長度為1的子…

C語言查漏補缺:基礎篇

1.原理 C語言是一門編譯型計算機語言,要編寫C代碼,C源代碼文本文件本身無法直接執行,必須通過編譯器翻譯和鏈接器的鏈接,生成二進制的可執行文件,然后才能執行。這里的二進制的可執行文件就是我們最終要形成的可執行程…

TPS入門DAY02 服務器篇

1.創建空白插件 2.導入在線子系統以及在線steam子系統庫 MultiplayerSessions.uplugin MultiplayerSessions.Build.cs 3.創建游戲實例以及初始化會話創建流程 創建會話需要的函數,委托,委托綁定的回調,在線子系統接口綁定某一個委托的控制其…

產品經理課程

原型工具 一、土耳其機器人 這個說法來源于 1770 年出現的一個騙局,一個叫沃爾夫岡馮肯佩倫(Wolfgang von Kempelen)的人為了取悅奧地利女皇瑪麗婭特蕾莎(Maria Theresia),“制造”了一個會下國際象棋的機…

nginx中的limit_req 和 limit_conn

在 Nginx 中,limit_req 和 limit_conn 是兩個用于限制客戶端請求的指令,它們分別用于限制請求速率和并發連接數。 limit_req limit_req 用于限制請求速率,防止客戶端發送過多請求影響服務器性能。它通過 limit_req_zone 指令定義一個共享內存…

基于winform的串口調試助手

目錄 一、串口助手界面設計 1.1 串口配置 1.2 接收配置 1.3 發送配置 1.4 接收窗口和發送窗口 1.5 狀態顯示窗口 1.6 串口通訊控件 二、程序編寫 2.1 端口號自動識別并顯示在端口號下拉框 功能說明: 2.2 波特率下拉框顯示 2.3 數據位下拉框顯示 2.4 校…

Docker基礎2

如需轉載,標記出處 本次我們將下載一個 Docker 鏡像,從鏡像中啟動容器 上一章,安裝 Docker 時,獲得兩個主要組件: Docker 客戶端 Docker 守護進程(有時稱為“服務器”或“引擎”) 守護進程實…

Rocketmq2

一、生產者端防丟失 1. 發送方式選擇 同步發送:使用 send() 方法,等待 Broker 確認響應(SendResult),確保消息已成功發送。異步發送:使用 sendAsync() 方法并設置回調函數,處理發送成功 / 失敗…

RabbitMQ詳解,RabbitMQ是什么?架構是怎樣的?

目錄 一,RabbitMQ是什么? 二,RabbitMQ架構 2.1 首先我們來看下RabbitMQ里面的心概念Queue是什么? 2.2 交換器Exchange 2.3 RabbitMQ是什么? 2.4 重點看下優先級隊列是什么? 三,RabbitMQ集群 3.1 普通集群模式 3.2 鏡像隊列集群 一,RabbitMQ是什么? 假設我們程序…

【一步步開發AI運動APP】六、運動計時計數能調用

之前我們為您分享了【一步步開發AI運動小程序】開發系列博文,通過該系列博文,很多開發者開發出了很多精美的AI健身、線上運動賽事、AI學生體測、美體、康復鍛煉等應用場景的AI運動小程序;為了幫助開發者繼續深耕AI運動領域市場,今…