責任鏈模式的C++實現示例

核心思想

責任鏈模式是一種行為設計模式,允許多個對象都有機會處理請求,從而避免請求的發送者與接收者之間的耦合。請求沿著處理鏈傳遞,直到某個對象處理它為止。

解決的問題

?解耦請求發送者與處理者:請求的發送者無需知道具體由哪個對象處理請求。
?動態分配責任:可以在運行時動態調整處理鏈,靈活添加或移除處理者。
?避免硬編碼:避免將請求處理邏輯硬編碼在某個類中,提高代碼的可擴展性和可維護性。

使用場景

?多級審批流程:如請假審批、報銷審批等,每一級領導都可以處理或傳遞給上級。
?事件處理系統:如 GUI 事件處理,事件可以沿著組件鏈傳遞,直到被處理。
?日志記錄系統:不同級別的日志消息可以被不同的日志處理器處理。
?過濾器鏈:如 HTTP 請求過濾器,每個過濾器可以處理請求或傳遞給下一個過濾器。

優點

?解耦:請求發送者與處理者解耦,發送者無需知道具體處理者。
?動態性:可以在運行時動態調整處理鏈。
?單一職責:每個處理者只關注自己的職責,符合單一職責原則。

缺點

?性能問題:如果鏈過長,可能導致請求傳遞效率低下。
?不確定性:請求可能未被任何處理者處理,需要額外邏輯處理這種情況。

示例代碼

以下是一個簡單的責任鏈模式示例,模擬多級審批流程:

#include <iostream>
#include <memory>
#include <string>// 請求類
class Request {
public:Request(const std::string& content, int level) : content_(content), level_(level) {}std::string getContent() const { return content_; }int getLevel() const { return level_; }private:std::string content_; // 請求內容int level_;           // 請求級別
};// 處理者基類
class Handler {
public:virtual ~Handler() = default;void setNext(std::shared_ptr<Handler> next) { next_ = next; }virtual void handleRequest(const Request& request) {if (next_) {next_->handleRequest(request); // 傳遞給下一個處理者} else {std::cout << "Request未被處理: " << request.getContent() << std::endl;}}protected:std::shared_ptr<Handler> next_; // 下一個處理者
};// 具體處理者:經理
class Manager : public Handler {
public:void handleRequest(const Request& request) override {if (request.getLevel() <= 1) {std::cout << "經理處理請求: " << request.getContent() << std::endl;} else {Handler::handleRequest(request); // 傳遞給下一個處理者}}
};// 具體處理者:總監
class Director : public Handler {
public:void handleRequest(const Request& request) override {if (request.getLevel() <= 2) {std::cout << "總監處理請求: " << request.getContent() << std::endl;} else {Handler::handleRequest(request); // 傳遞給下一個處理者}}
};// 具體處理者:CEO
class CEO : public Handler {
public:void handleRequest(const Request& request) override {if (request.getLevel() <= 3) {std::cout << "CEO處理請求: " << request.getContent() << std::endl;} else {Handler::handleRequest(request); // 傳遞給下一個處理者}}
};int main() {// 創建處理鏈auto manager = std::make_shared<Manager>();auto director = std::make_shared<Director>();auto ceo = std::make_shared<CEO>();manager->setNext(director);director->setNext(ceo);// 創建請求Request request1("請假1天", 1);  // 經理處理Request request2("請假3天", 2);  // 總監處理Request request3("請假10天", 3); // CEO處理Request request4("請假30天", 4); // 未被處理// 處理請求manager->handleRequest(request1);manager->handleRequest(request2);manager->handleRequest(request3);manager->handleRequest(request4);return 0;
}

輸出結果

經理處理請求: 請假1天
總監處理請求: 請假3天
CEO處理請求: 請假10天
Request未被處理: 請假30天

代碼解析

?Request 類:封裝請求內容和級別。
?Handler 基類:定義處理請求的接口,并持有下一個處理者的指針。
?具體處理者 Manager、Director、CEO?:實現自己的處理邏輯,若無法處理則傳遞給下一個處理者。
?處理鏈:通過 setNext 方法動態構建處理鏈。

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

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

相關文章

Java 無 GUI 瀏覽器:HtmlUnit 入門及實戰 [特殊字符]

文章目錄 HtmlUnit 入門功能簡介入門案例更多功能HtmlUnit 實戰需求頁面分析編碼參考? 本文目標: HtmlUnit 框架入門HtmlUnit 框架實戰:實現 HtmlUnit 訪問 Web 頁面,并實現 Web 頁面按鈕點擊,同時獲取到下載的文件。HtmlUnit 入門 ?? 官網:https://htmlunit.sourcefo…

微軟 NativeAOT

微軟Native AOT&#xff08;Ahead-Of-Time&#xff09;是.NET平臺中一種新的運行模式&#xff0c;它直接將IL&#xff08;Intermediate Language&#xff0c;中間語言&#xff09;代碼編譯為目標平臺的機器碼發布&#xff0c;與JIT&#xff08;Just-In-Time&#xff0c;即時編譯…

Vue項目搜索引擎優化(SEO)終極指南:從原理到實戰

文章目錄 1. SEO基礎與Vue項目的挑戰1.1 為什么Vue項目需要特殊SEO處理&#xff1f;1.2 搜索引擎爬蟲工作原理 2. 服務端渲染&#xff08;SSR&#xff09;解決方案2.1 Nuxt.js框架實戰原理代碼實現流程圖 2.2 自定義SSR實現 3. 靜態站點生成&#xff08;SSG&#xff09;技術3.1…

Java 枚舉

一、簡介 Java 枚舉是一種強大的工具&#xff0c;其本質上是一個繼承自 java.lang.Enum 的類&#xff0c;用于定義一組固定的常量&#xff0c;每個枚舉常量都是該枚舉類的一個實例。枚舉不僅提供了類型安全性&#xff0c;還可以像普通類一樣擁有字段、方法和構造函數。枚舉的使…

CentOS7安裝DNS服務器bind

文章目錄 安裝DNS服務設置配置文件自定義域名解析完整配置 需求是公司內網服務器無法連接外網&#xff0c;需要在本地搭建DNS服務&#xff0c;這樣物理機器遷移到內網后&#xff0c;通過域名解析訪問服務 DNS服務器 172.25.14.215 ip域名172.25.14.216mysql.server172.25.14.2…

DFS刷題(25.3.13)

題目1——烤雞 題目描述 題解 這是一個簡單的暴搜題目&#xff0c;由于一共由10種配料&#xff0c;每種配料可以放1到3克&#xff0c;因此只需要用dfs對每種配料放入的質量進行暴力搜索即可&#xff0c;如果放入的配料質量之和等于題目給出的美味程度 n n n&#xff0c;記錄一…

C#中除了Dictionary,List,HashSet,HashTable 還有哪些可以保存列表的數據類型?

在 C# 中&#xff0c;除了 Dictionary、List、HashSet 和 Hashtable 之外&#xff0c;還有許多其他可以保存列表或集合類型的數據結構&#xff0c;具體包括以下幾類&#xff1a; &#x1f4cc; 數組類 1. Array&#xff08;數組&#xff09; 固定長度&#xff0c;性能高&…

《Python實戰進階》第21集:數據存儲:Redis 與 MongoDB 的使用場景

第21集&#xff1a;數據存儲&#xff1a;Redis 與 MongoDB 的使用場景 摘要 在現代應用開發中&#xff0c;數據存儲的選擇直接影響系統的性能、擴展性和成本。Redis 和 MongoDB 是兩種極具代表性的數據庫技術&#xff0c;它們分別擅長解決不同場景下的問題。本文將深入探討 Re…

三視圖轉stl導出 空心面片體 networkx shapely triangle numpy-stl

from shapely.geometry import Polygon import triangle from shapely.ops import unary_union from stl import mesh import numpy as np from collections import defaultdict from 三維投影線段尋找 import get_adjusted_clusters,get_clusters,get_intersect_lines import …

大摩閉門會:250312 學習總結報告

如果圖片分辨率不足&#xff0c;可右鍵圖片在新標簽打開圖片或者下載末尾源文件進行查看 本文只是針對視頻做相應學術記錄&#xff0c;進行學習討論使用

【51單片機】程序實驗15.DS18B20溫度傳感器

主要參考學習資料&#xff1a;B站【普中官方】51單片機手把手教學視頻 開發資料下載鏈接&#xff1a;http://www.prechin.cn/gongsixinwen/208.html 單片機套裝&#xff1a;普中STC51單片機開發板A4標準版套餐7 目錄 DS18B20介紹主要特性內部結構控制時序初始化時序寫時序讀時序…

ESP32芯片模組方案,設備物聯網無線通信,WiFi藍牙交互控制應用

在當下&#xff0c;物聯網正以前所未有的速度席卷全球&#xff0c;從繁華都市的智能建筑&#xff0c;到寧靜鄉村的智慧農業&#xff0c;從人們日常使用的可穿戴設備&#xff0c;到工業領域復雜精密的自動化生產線&#xff0c;物聯網的觸角已深入到生活與生產的每一個角落。 而…

Linux第二次練習

1.首先在根下面創建一個名為text的目錄 2.在根目錄下新建一個text目錄&#xff0c;然后在text目錄中新建上圖的一級目錄、二級目錄以及三級目錄 3.顯示/text目錄下文件的樹形拓撲圖 4.將linux樹狀結構圖中列出的所有文件用ll命令列出來

百雞問題-

百雞問題 #include<stdio.h> int main(){int n;scanf("%d",&n);int x,y,z;for(x0;x<100;x){for(y0;y<100;y){for(z0;z<100;z){if((x*15y*9z)<(3*n) && ((xyz)100)){printf("x%d,y%d,z%d\n",x,y,z);}}}}return 0; }

LVDS(Low Voltage Differential Signaling)電平詳解

一、LVDS的定義與核心特性 LVDS&#xff08;低壓差分信號&#xff09;是一種 低功耗、高速、抗干擾 的差分信號傳輸技術&#xff0c;通過一對互補的電壓信號&#xff08;正負端差值&#xff09;傳遞數據。其核心特性包括&#xff1a; 電氣特性 電壓擺幅&#xff1a;差分電壓約…

【OpenFeign 面試專題】

OpenFeign 面試專題 OpenFeign 的核心原理OpenFeign 如何與 Ribbon、Hystrix 集成Ribbon的負載均衡策略如何自定義 OpenFeign 的請求編碼和響應解碼OpenFeign 如何傳遞請求頭&#xff08;Header&#xff09;信息OpenFeign 如何處理超時和重試OpenFeign 支持哪些 HTTP 客戶端實現…

Adobe Acrobat Pro setting

防火墻斷網組織彈窗 Adobe軟件突然彈窗“THIS APP HAS BEEN DISABLED”&#xff1f;別慌&#xff0c;幾步教你輕松解決&#xff01; 禁用代理 解決Adobe出現This unlicensed Photoshop app has been disabled.禁止使用 rules:- DOMAIN-KEYWORD,adobe,REJECT

搜索插入位置(js實現,LeetCode:35)

給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法。 示例 1: 輸入: nums [1,3,5,6], target 5 輸出: 2示例 2: 輸入…

5. 前后端實現文件上傳與解析

1. 說明 在實際開發中&#xff0c;比較常見的一個功能是需要在前端頁面中選擇系統中的某個文件上傳到服務器中進行解析&#xff0c;解析后的文件內容可以用來在服務器中當作參數&#xff0c;或者傳遞給其它組件使用&#xff0c;或者需要存儲到數據庫中。所以本文就提供一種方式…

《靈珠覺醒:從零到算法金仙的C++修煉》卷三·天劫試煉(32)萬劍歸宗破妖陣 - 最長遞增子序列(LIS)

《靈珠覺醒:從零到算法金仙的C++修煉》卷三天劫試煉(32)萬劍歸宗破妖陣 - 最長遞增子序列(LIS) 哪吒在數據修仙界中繼續他的修煉之旅。這一次,他來到了一片神秘的萬劍谷,谷中有一座巨大的萬劍歸宗劍陣,劍陣閃爍著神秘的光芒。谷口有一塊巨大的石碑,上面刻著一行文字:…