設計模式--責任鏈模式

責任鏈模式是一種行為設計模式,它允許將請求沿著處理者鏈進行發送。請求會沿鏈傳遞,直到某個處理者對象負責處理它。這種模式在許多應用場景中非常有用,例如在處理用戶輸入、過濾請求以及實現多級審核時。

應用場景

  1. 處理用戶輸入:當需要根據不同的條件處理用戶輸入時,可以使用責任鏈模式來將輸入請求沿處理者鏈進行傳遞,直到找到合適的處理者。
  2. 過濾請求:當需要對請求進行過濾,例如日志記錄、權限檢查等時,可以使用責任鏈模式來依次執行不同的過濾器。
  3. 實現多級審核:當需要實現一個多級審核流程,例如請假審批、報銷審批等時,可以使用責任鏈模式來將審核請求沿審核者鏈進行傳遞。

使用技巧與注意事項

  1. 定義處理者接口:為了使用責任鏈模式,需要定義一個處理者接口,該接口包含處理請求的方法以及指向下一個處理者的引用。
  2. 避免鏈的循環引用:在構建責任鏈時,需要注意避免鏈的循環引用,確保請求能夠正確地沿著鏈進行傳遞。
  3. 處理者數量的管理:責任鏈中的處理者數量可能會影響性能,因此需要根據實際情況合理地管理處理者數量。

C++代碼示例

下面是一個使用C++編寫的責任鏈模式示例代碼:

#include <iostream>
#include <string>
// 處理者接口
class Handler {
public:virtual Handler* setNext(Handler* next) = 0;virtual void handleRequest(std::string request) = 0;virtual ~Handler() {}
};
// 具體處理者類
class ConcreteHandler : public Handler {
private:Handler* nextHandler;
public:ConcreteHandler() : nextHandler(nullptr) {}Handler* setNext(Handler* next) override {this->nextHandler = next;return this;}void handleRequest(std::string request) override {if (nextHandler != nullptr) {nextHandler->handleRequest(request);} else {std::cout << "Request: " << request << " handled by ConcreteHandler" << std::endl;}}
};
int main() {ConcreteHandler* handler1 = new ConcreteHandler();ConcreteHandler* handler2 = new ConcreteHandler();ConcreteHandler* handler3 = new ConcreteHandler();handler1->setNext(handler2)->setNext(handler3);handler1->handleRequest("Request 1");handler1->handleRequest("Request 2");handler1->handleRequest("Request 3");delete handler1;delete handler2;delete handler3;return 0;
}

在這個示例中,我們定義了一個處理者接口 Handler,它包含設置下一個處理者的方法以及處理請求的方法。具體處理者類 ConcreteHandler 實現了這些方法,并提供了處理請求的邏輯。客戶端代碼創建了多個處理者對象,并將它們連接成鏈。通過這個示例,我們可以看到責任鏈模式在C++中的實現。
總之,責任鏈模式是一種非常有用的設計模式,它可以幫助我們處理復雜的請求處理流程,提高代碼的靈活性和可維護性。在實際開發中,我們需要根據具體的應用場景來選擇是否使用責任鏈模式,并注意相關的使用技巧和注意事項。

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

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

相關文章

kafka之consumer參數auto.offset.reset

Kafka的auto.offset.reset 參數是用于指定消費者在啟動時如何處理偏移量&#xff08;offset&#xff09;的。這個參數有三個主要的取值&#xff1a;earliest、latest和none。 earliest&#xff1a; 當各分區下有已提交的offset時&#xff0c;從提交的offset開始消費&#xff1b…

HCIP-VLAN綜合實驗

一、實驗拓撲 二、實驗要求 1、pc1和pc3所在接口為access;屬于vlan 2; PC2/PC4/PC5/PC6處于同一網段’其中PC2可以訪問PC4/PC5/PC6; PC4可以訪問PC6&#xff1b;PC5不能訪問PC6&#xff1b; 2、PC1/PC3與PC2/PC4/PC5/PC6不在同一個網段&#xff1b; 3、所有PC通過DHCP獲取IP…

棧和隊列的應用-計算器實例

‘’‘ &#xff08;11 3&#xff09; 2 -5 順序存儲棧來實現 ’‘’ sqstack.h #ifndef SQSTACK_H__ #define SQSTACK_H__ #define MAXSIZE 32 typedef int datatype typedef struct node_st {datatype data[MAXSIZE]; int top;}sqstack;sqstack *st_create(void); int s…

閑話 .NET(5):.NET Core 有什么優勢?

前言 .NET Core 并不是 .NET FrameWork 的升級版&#xff0c;它是一個為滿足新一代的軟件設計要求而從頭重新開發的開發框架和平臺&#xff0c;所以它沒有 .NET FrameWork 的歷史包袱&#xff0c;相對于 .NET FrameWork&#xff0c;它具備很多優勢。 .NET Core 有哪些優勢&am…

智算中心帶寬漫談 -- 開篇

隱秘的角落 帶寬對高性能計算是一個永恒的話題&#xff0c;本質上&#xff0c;帶寬即數據交換的速率&#xff0c;單位時間的傳輸數據越多&#xff0c;帶寬就越高&#xff0c;但對高性能計算來說&#xff0c;對高帶寬的渴求永無止境&#xff0c;好比宏觀現實世界中的車道&#…

QT實現線程的四種方式(QThread、QRunnable和QThreadPool、QObject、QtConcurrent)

在當今高性能計算需求日益增長的背景下,多線程編程已成為提升應用性能的重要手段。Qt框架,作為一個功能全面、跨平臺的C++應用程序開發工具包,為我們提供了多種多線程實現方案。本文將介紹QThread類在Qt多線程編程中的應用,以及如何通過QRunnable和QThreadPool、QObject的m…

C# GDI+ 繪制文字不同的操作系統渲染文字大小不同

一、C# GDI 繪制文字不同的操作系統渲染文字大小不同 原因&#xff1a;使用Font 字體的時候&#xff0c;沒有指定字體渲染的單位。 不同系統的默認字體單位會不同。 二、解決方案&#xff1a; 在指定字體的時候&#xff0c;指定字體大小&#xff0c;同時也要設置字體的單位 …

sqlserver 創建表,列及表,列描述

-- 創建表 CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,EmployeeName NVARCHAR(100),EmployeeEmail NVARCHAR(100) );-- 為表添加描述 EXEC sp_addextendedproperty name NMS_Description, value N員工信息表, level0type NSchema, level0name dbo, level1type N…

springboot整合kkFileView部署,前端使用

前言&#xff1a; 官方文檔&#xff1a;https://kkfileview.keking.cn/zh-cn/docs/production.html docker方式或加入星球獲取發行包直接獲取啟動&#xff0c;無需以下步驟&#xff1a; 拉取鏡像# 網絡環境方便訪問docker中央倉庫 docker pull keking/kkfileview:4.1.0# 網…

pytest框架的代碼如何用vscode進行debug

{"version": "0.2.0","configurations": [{"name": "Python: Run My Module", // 配置名稱&#xff0c;將在調試配置下拉列表中顯示"type": "debugpy", // 調試類型&#xff0c;這里是Python"requ…

二元關系表示

一、二元關系的定義和表示 什么是二元關系&#xff1f;對集合A和B&#xff0c;A\timesB的任意子集R為A到B的一個二元關系。當AB時&#xff0c;A\timesA的任一子集R稱為A上的一個二元關系。在不引起誤解的情況下&#xff0c;二元關系可簡稱關系。 若|A|m,|B|n&#xff0c;則A到…

常用字體映射字典

表格形式 英文字體名稱中文字體名稱SimSun宋體SimHei黑體KaiTi楷體FangSong仿宋YouYuan幼圓LiSu隸書NSimSun新宋體SimSun-ExtB宋體-ExtBFangSong_GB2312仿宋_GB2312KaiTi_GB2312楷體_GB2312Microsoft YaHei微軟雅黑Microsoft JhengHei微軟正黑體STXihei華文細黑STKaiti華文楷體…

手機版AI寫作軟件哪個好用?5款AI寫作軟件分享

在這個快節湊的時代&#xff0c;人們對于高效、便捷的創作方式很是追求。尤其是在人工智能技術發展迅速的今天&#xff0c;AI寫作軟件的出現&#xff0c;讓很多自媒體創作者都會想到在手機上面進內容創作&#xff0c;這樣不僅能提高工作效率&#xff0c;而且工作的自由度會更高…

自動化運維(AIOps): 現代IT管理的革命

在數字化時代&#xff0c;企業的 IT 系統變得愈加復雜。從云計算到大數據&#xff0c;從物聯網到人工智能&#xff0c;技術的飛速發展使得企業面臨前所未有的挑戰。這種復雜性不僅體現在數據量和數據流的增加上&#xff0c;還包括高成本和高錯誤率的運維需求。在此背景下&#…

基于51單片機的盆栽自動澆花系統

一.硬件方案 工作原理是濕度傳感器將采集到的數據直接傳送到ADC0832的IN端作為輸入的模擬信號。選用濕度傳感器和AD轉換&#xff0c;電路內部包含有濕度采集、AD轉換、單片機譯碼顯示等功能。單片機需要采集數據時&#xff0c;發出指令啟動A/D轉換器工作&#xff0c;ADC0832根…

Hive 變量定義與引用

文章目錄 1.背景2.Hive 變量命名空間查看變量設置變量引用變量 參考文獻 1.背景 在書寫 Hive SQL 時&#xff0c;有時需要將重復出現的值從 SQL 分離出來&#xff0c;以變量的方式表示和引用。 設置變量和引用變量可以帶來以下幾個好處&#xff1a; 簡化查詢語句&#xff1a;…

Android 實現豎排文本(垂直方向顯示)

Android 實現豎排文本-垂直方向顯示 前言效果圖代碼實現方式一 Custom View1. 自定義視圖 VerticalTextView2. 在xml布局文件中使用3. 設置文本內容 方式二 使用 TextView 的 rotation屬性方式三 使用帶有跨距文本的TextView1. 自定義視圖 VerticalTextView2. 在xml布局文件中使…

AI學習指南數學工具篇-凸優化基礎知識凸函數

AI學習指南數學工具篇-凸優化基礎知識凸函數 引言 在凸優化過程中&#xff0c;凸函數是一個非常重要的概念&#xff0c;它在機器學習、深度學習和優化算法中都有廣泛的應用。凸函數具有很多獨特的性質&#xff0c;能夠幫助我們更好地理解優化問題并且設計高效的優化算法。本文…

【Golang】Golang獲取Gin框架PostForm上傳的文件

文章目錄 前言一、函數解釋二、代碼實現三、總結 前言 在Web開發中&#xff0c;文件上傳是一項常見的功能。例如&#xff0c;用戶可能需要上傳頭像、文檔或其他類型的文件。在Go語言的Gin框架中&#xff0c;我們可以很方便地處理文件上傳。在這篇博客中&#xff0c;我將解釋如…

怎樣理解 Vue 的單項數據流

Vue 的單項數據流是一個核心概念&#xff0c;它指的是在 Vue 組件中&#xff0c;數據的流動方向是單向的&#xff0c;從父組件流向子組件。以下是關于 Vue 單項數據流的詳細理解&#xff1a; 數據流的方向&#xff1a; Vue 中的數據流動是單向的&#xff0c;即數據只能從父組件…