C# 設計模式(行為型模式):責任鏈模式

C# 設計模式(行為型模式):責任鏈模式

責任鏈模式(Chain of Responsibility Pattern)是一種行為型設計模式,用于讓多個對象有機會處理同一個請求,避免請求發送者與接收者之間的耦合。它通過將請求沿著一條鏈傳遞,直到某個對象處理它,從而實現了請求和處理者的動態解耦。


一、責任鏈模式的核心概念
  1. 請求傳遞:將請求從一個對象傳遞到下一個對象,直到找到能夠處理請求的對象為止。
  2. 職責分離:每個對象專注于處理自己的職責,其他職責交由鏈上的其他對象處理。
  3. 動態鏈條:鏈條的結構可以動態調整,靈活擴展。

二、模式結構

在責任鏈模式中,通常包含以下角色:

  1. Handler(抽象處理者)
    定義一個接口,聲明處理請求的方法,以及一個引用指向下一個處理者。

  2. ConcreteHandler(具體處理者)
    實現抽象處理者接口,負責處理具體的請求。如果不能處理,則將請求傳遞給下一個處理者。

  3. Client(客戶端)
    創建并配置責任鏈,并向鏈的起點發出請求。


三、適用場景
  • 職責分散:需要將職責分散到多個對象中,以便降低耦合度。
  • 動態處理:某些請求需要靈活地由不同的對象處理。
  • 多級審批:如審批系統、權限管理等需要逐級處理的場景。

四、C# 實現案例
1. 場景描述

假設一個公司有以下審批流程:

  • 如果報銷金額小于 1000 元,由經理審批。
  • 如果金額在 1000 元到 5000 元之間,由總監審批。
  • 如果金額超過 5000 元,由副總裁審批。
2. 實現代碼
using System;namespace ChainOfResponsibilityExample
{// 抽象處理者abstract class Approver{protected Approver NextApprover;public void SetNext(Approver nextApprover){NextApprover = nextApprover;}public abstract void HandleRequest(PurchaseRequest request);}// 具體處理者:經理class Manager : Approver{public override void HandleRequest(PurchaseRequest request){if (request.Amount < 1000){Console.WriteLine($"經理批準了金額為 {request.Amount} 元的請求。");}else if (NextApprover != null){NextApprover.HandleRequest(request);}}}// 具體處理者:總監class Director : Approver{public override void HandleRequest(PurchaseRequest request){if (request.Amount >= 1000 && request.Amount <= 5000){Console.WriteLine($"總監批準了金額為 {request.Amount} 元的請求。");}else if (NextApprover != null){NextApprover.HandleRequest(request);}}}// 具體處理者:副總裁class VicePresident : Approver{public override void HandleRequest(PurchaseRequest request){if (request.Amount > 5000){Console.WriteLine($"副總裁批準了金額為 {request.Amount} 元的請求。");}else if (NextApprover != null){NextApprover.HandleRequest(request);}}}// 請求類class PurchaseRequest{public double Amount { get; }public PurchaseRequest(double amount){Amount = amount;}}// 客戶端class Program{static void Main(string[] args){// 構建責任鏈Approver manager = new Manager();Approver director = new Director();Approver vicePresident = new VicePresident();manager.SetNext(director);director.SetNext(vicePresident);// 模擬請求var request1 = new PurchaseRequest(500);var request2 = new PurchaseRequest(3000);var request3 = new PurchaseRequest(10000);manager.HandleRequest(request1);manager.HandleRequest(request2);manager.HandleRequest(request3);}}
}

五、運行結果

執行上述代碼后,輸出如下:

經理批準了金額為 500 元的請求。
總監批準了金額為 3000 元的請求。
副總裁批準了金額為 10000 元的請求。

六、優缺點分析
優點
  1. 解耦請求與處理者:發送者無需知道具體的處理者是誰,減少了系統耦合。
  2. 職責分離:每個處理者只需專注于自己的職責,代碼清晰易維護。
  3. 易于擴展:可以輕松添加新的處理者,調整鏈條結構。
缺點
  1. 可能無處理者響應:如果鏈的末端沒有處理請求的邏輯,可能導致請求丟失。
  2. 性能開銷:請求需要沿著鏈傳遞,鏈條過長可能影響性能。

七、實際應用場景
  1. 審批流程:多級審批系統中,每個級別的管理者負責不同金額范圍的審批。
  2. 日志處理:不同級別的日志可以由不同的處理器記錄(如控制臺、文件或遠程服務器)。
  3. 權限驗證:多級權限驗證鏈,根據用戶角色處理請求。

八、總結

責任鏈模式是一種優雅的設計模式,適用于需要動態分配職責的場景。通過它,可以實現請求發送者與處理者的解耦,使系統具有更好的擴展性和靈活性。如果你正在設計一個多級處理的系統,不妨試試責任鏈模式!

希望這篇文章能幫助你更好地理解責任鏈模式!如果有疑問或建議,歡迎在評論區留言 😊

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

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

相關文章

在K8S中,如何部署kubesphere?

在Kubernetes集群中&#xff0c;對于一些基礎能力較弱的群體來說K8S控制面板操作存在一定的難度&#xff0c;此時kubesphere可以有效的解決這類難題。以下是部署kubesphere的操作步驟&#xff1a; 操作部署&#xff1a; 1. 部署nfs共享存儲目錄 yum -y install nfs-server e…

CSS系列(43)-- Anchor Positioning詳解

前端技術探索系列&#xff1a;CSS Anchor Positioning詳解 &#x1f3af; 致讀者&#xff1a;探索智能定位的藝術 &#x1f44b; 前端開發者們&#xff0c; 今天我們將深入探討 CSS Anchor Positioning&#xff0c;這個強大的元素定位特性。 基礎概念 &#x1f680; 錨點設…

Python判別不同平臺操作系統調用相應的動態庫讀寫NFC

本示例使用的發卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bV0E4YV&ftt&id615391857885 import sys import struct # struct的pack函數把任意數據類型變成字符串 import ctypes # 調用DLL動態庫要有這個引用if sys.platform…

樹莓派之旅-第一天 系統的燒錄和設置

自言自語&#xff1a; 在此記錄一下樹莓派的玩法。以后有錢了買點來玩啊草 系統的安裝燒錄 系統下載 樹莓派官網&#xff1a;https://www.raspberrypi.com/ 首頁點擊SoftWare進入OS下載頁面 這里是安裝工具&#xff1a;安裝工具負責將系統鏡像安裝到sd卡中 點擊下載符合自己…

商用車自動駕駛,迎來大規模量產「臨界點」?

商用車自動駕駛&#xff0c;正迎來新的行業拐點。 今年初&#xff0c;交通部公開發布AEB系統運營車輛標配征求意見稿&#xff0c;首次將法規限制條件全面放開&#xff0c;有望推動商用車AEB全面標配&#xff0c;為開放場景的商用車智能駕駛市場加了一把火。 另外&#xff0c;…

人工智能及深度學習的一些題目

1、一個含有2個隱藏層的多層感知機&#xff08;MLP&#xff09;&#xff0c;神經元個數都為20&#xff0c;輸入和輸出節點分別由8和5個節點&#xff0c;這個網絡有多少權重值&#xff1f; 答&#xff1a;在MLP中&#xff0c;權重是連接神經元的參數&#xff0c;每個連接都有一…

Solon 加入 GitCode:助力國產 Java 應用開發新飛躍

在當今數字化快速發展的時代&#xff0c;Java 應用開發框架不斷演進&#xff0c;開發者們始終在尋找更快、更小、更簡單的解決方案。近期&#xff0c;Solon 正式加入 GitCode&#xff0c;為廣大 Java 開發者帶來全新的開發體驗&#xff0c;尤其是在國產應用開發進程中&#xff…

VScode 只能運行c,運行不了c++的解決問題

原文鏈接&#xff1a;Vscode只能運行c&#xff0c;運行不了c的解決方法 VScode 只能運行c&#xff0c;運行不了c&#xff0c;怎么回事呢&#xff0c;解決問題&#xff1a; 在tasks.json中加上“"-lstdc"”&#xff0c; 這樣之后 要重啟VScode&#xff0c;點擊鏈接…

Ansible Jinja2 語法簡介及使用

1、Jinja2 介紹 Jinja2 是基于 python 的模板引擎&#xff0c;功能比較類似于 PHP 的 smarty&#xff0c;J2ee 的 Freemarker和velocity。它能完全支持unicode&#xff0c;并具有集成的沙箱執行環境&#xff0c;應用廣泛。 jinja2使用BSD授權 Jinja2的語法是由 variables(變量…

SpringCloud系列教程:微服務的未來 (五)枚舉處理器、JSON處理器、分頁插件實現

在現代 Java 開發中&#xff0c;我們常常需要處理各種通用的功能和需求&#xff0c;諸如枚舉的處理、JSON 數據處理&#xff0c;以及分頁查詢等。這些功能雖然看似簡單&#xff0c;但在實際開發中往往涉及到許多細節和優化。為了提高開發效率、減少重復代碼的編寫&#xff0c;我…

游戲引擎學習第69天

回顧碰撞響應時我們停留的位置 從昨天的討論開始&#xff0c;我們正準備處理碰撞響應的復雜性。具體來說&#xff0c;我們討論的是&#xff0c;當兩個實體在屏幕上發生碰撞時&#xff0c;如何回應這種情況。碰撞本身并不復雜&#xff0c;但要處理其后的反應和規則則更具挑戰性…

【Linux】信號處理

一、Linux系統信號 1、常見的系統信號 常見的Linux系統信號 信號值描述1SIGHUP掛起&#xff08;hang up&#xff09;進程2SIGINT中斷進&#xff08;interrupt&#xff09;程3SIGQUIT停止&#xff08;stop&#xff09;進程9SIGKILL無條件終止&#xff08;terminate&#xff09;…

開源模型應用落地-qwen2-7b-instruct-LoRA微調-Axolotl-單機多卡-RTX 4090雙卡(七)

一、前言 本篇文章將使用Axolotl去高效微調QWen2系列模型,通過閱讀本文,您將能夠更好地掌握這些關鍵技術,理解其中的關鍵技術要點,并應用于自己的項目中。 二、術語介紹 2.1. LoRA微調 LoRA (Low-Rank Adaptation) 用于微調大型語言模型 (LLM)。 是一種有效的自適應策略,…

數據結構與算法學習筆記----快速冪

數據結構與算法學習筆記----快速冪 author: 明月清了個風 first publish time: 2025.1.2 ps??快速冪的兩道模版題&#xff0c;快速冪&#xff0c;乘法逆元&#xff0c;費馬小定理 Acwing 875. 快速冪 [原題鏈接](875. 快速冪 - AcWing題庫) 給定 n n n組 a i , b i , p i…

爬蟲代碼中如何添加異常處理?

在編寫爬蟲代碼時&#xff0c;添加異常處理是非常重要的一步&#xff0c;因為它可以幫助我們處理網絡請求中可能出現的各種問題&#xff0c;比如網絡連接錯誤、超時、解析錯誤等。以下是如何在Python爬蟲代碼中添加異常處理的示例&#xff1a; import requests from bs4 impor…

MAC環境安裝(卸載)軟件

MAC環境安裝&#xff08;卸載&#xff09;軟件 jdknode安裝node&#xff0c;并實現不同版本的切換背景 卸載node從node官網下載pkg安裝的node卸載用 homebrew 安裝的node如果你感覺刪的不夠干凈&#xff0c;可以再細分刪除驗證刪除結果 jdk 1.下載jdk 先去官網下載自己需要的版…

本地LLM部署--llama.cpp

–圖源GitHub項目主頁 概述 llama.cpp是以一個開源項目&#xff08;GitHub主頁&#xff1a;llamma.cpp&#xff09;&#xff0c;也是本地化部署LLM模型的方式之一&#xff0c;除了自身能夠作為工具直接運行模型文件&#xff0c;也能夠被其他軟件或框架進行調用進行集成。 其…

uniapp中使用ruoyiPlus中的加密使用(crypto-js)

package.json中添加 "crypto-js": "^4.2.0", "jsencrypt": "^3.3.2",但是vue2中使用 import CryptoJS from cryptojs; 這一步就會報錯 參照 參照這里&#xff1a;vue2使用CryptoJS實現信息加解密 根目錄下的js文檔中新增一個AESwork.…

go項目使用gentool生成model的gen.go問題

Gen Tool 是一個沒有依賴關系的二進制文件&#xff0c;可以用來從數據庫生成結構。 使用方法&#xff1a; go install gorm.io/gen/tools/gentoollatest在項目根目錄,執行連接的數據庫中指定某幾張表結構生成數據庫model層 gentool -dsn "root:123456tcp(localhost:330…

路由基本配置實驗

路由器用于實現不同類型網絡之間的互聯。 路由器轉發ip分組的基礎是路由表。 路由表中的路由項分為直連路由項、靜態路由項和動態路由項。 通過配置路由器接口的ip地址和子網掩碼自動生成直連路由項。 通過手工配置創建靜態路由項。 熱備份路由器協議允許將由多個路由器組…