代理模式——C++實現

目錄

1. 代理模式簡介

2. 代碼示例


1. 代理模式簡介

代理模式是一種行為型模式

代理模式的定義:由于某些原因需要給某對象提供一個代理以控制該對象的訪問。這時,訪問對象不適合或者不能直接訪問引用目標對象,代理對象作為訪問對象和目標對象之間的中介,代理模式也叫做委托模式。


代理模式實際上作為一個中間層,處于要操作的目標對象和客戶代碼之間的中間層。相當于一個中介。

代理模式涉及到的角色主要有三個:

  1. 抽象主題(抽象接口類):通過接口類聲明真實主題的業務接口。
  2. 真實主題(業務實現類):實現了具體的業務,是代理對象所引用的真實對象。
  3. 代理類:提供了和真實主題相同的接口,并引用了一個真實主題對象,可以調用具體的業務接口,訪問真實主題的功能。

UML類圖如下所示:


以租房為例,房屋中介就相當于代理對象,房東就相當于真實主題。客戶只需要和中介打交道即可。

代理對象并不真正實現服務,而是通過調用引用的真實對象的相應接口來提供服務,真正的業務還是由真實主題來完成。

代理對象的目的在于執行具體業務的前后加入一些其他的操作,比如權限控制、緩存、日志記錄等功能。

這樣真實的業務類就可以專注于業務的實現,其他的限制操作在代理類中實現。

代理模式的關鍵就在于代理類和真實主題類繼承自相同的接口,并且代理模式引用一個真實的主題對象。

2. 代碼示例

這里我們模擬一個計算器的程序,代理類將限制計算器的使用次數,超過使用次數上限將限制訪問。

#if 1#include <iostream>using namespace std;class Subject
{
public:virtual int add(int a, int b) = 0;virtual int sub(int a, int b) = 0;
};class RealSubject : public Subject
{
public:int add(int a, int b){return a + b;}int sub(int a, int b){return a - b;}
};class Proxy : public Subject
{
private:RealSubject* m_realSubject;unsigned int m_count;
public:Proxy(RealSubject* realSubject, unsigned int count = 3){m_realSubject = realSubject;m_count = count;}int add(int a, int b){if (m_count == 0){cout << "剩余訪問次數為0,無法訪問" << endl;return 0;}else{m_count--;cout << "剩余訪問次數:" << m_count << endl;return m_realSubject->add(a, b);}}int sub(int a, int b){if (m_count == 0){cout << "剩余訪問次數為0,無法訪問" << endl;return 0;}else{m_count--;cout << "剩余訪問次數:" << m_count << endl;return m_realSubject->sub(a, b);}}};int main()
{RealSubject realSubject;Proxy proxy(&realSubject);cout << proxy.add(10, 5) << endl;cout << proxy.sub(10, 5) << endl;cout << proxy.add(10, 5) << endl;cout << proxy.sub(10, 5) << endl;cout << proxy.add(10, 5) << endl;return 0;
}#endif

運行結果如下圖所示:

?

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

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

相關文章

Vue3 表單:全面解析與最佳實踐

Vue3 表單&#xff1a;全面解析與最佳實踐 引言 隨著前端技術的發展&#xff0c;Vue.js 已經成為最受歡迎的前端框架之一。Vue3 作為 Vue.js 的最新版本&#xff0c;帶來了許多改進和新的特性。其中&#xff0c;表單處理是 Vue 應用中不可或缺的一部分。本文將全面解析 Vue3 …

C++11新特性之范圍for循環

1.介紹 C11標準之前&#xff0c;使用for循環遍歷數組或容器&#xff0c;只能使用以下結構&#xff1a; for&#xff08;表達式1&#xff1b;表達式2&#xff1b;表達式3&#xff09;{ 循環體 } 那么在C11標準中&#xff0c;除了上面的方法外&#xff0c;又引入了一種全新的語…

攻防世界 fileclude

代碼審計 WRONG WAY! <?php include("flag.php"); highlight_file(__FILE__);//高亮顯示文件的源代碼 if(isset($_GET["file1"]) && isset($_GET["file2"]))//檢查file1和file2參數是否存在 {$file1 $_GET["file1"];$fi…

圖書管理系統 Axios 源碼__獲取圖書列表

目錄 核心功能 源碼介紹 1. 獲取圖書列表 技術要點 適用人群 本項目是一個基于 HTML Bootstrap JavaScript Axios 開發的圖書管理系統&#xff0c;可用于 添加、編輯、刪除和管理圖書信息&#xff0c;適合前端開發者學習 前端交互設計、Axios 數據請求 以及 Bootstrap 樣…

Vue 響應式渲染 - 列表布局和v-html

Vue 漸進式JavaScript 框架 基于Vue2的學習筆記 - Vue 響應式渲染 - 列表布局和v-html 目錄 列表布局 簡單渲染列表 顯示索引值 點擊變色 V-html 作用 注意 采用策略 應用 總結 列表布局 簡單渲染列表 Data中設置狀態&#xff0c;是一個數組格式的默認信息。 然后…

如何實現一個CLI命令行功能 | python 小知識

如何實現一個CLI命令行功能 | python 小知識 在現代軟件開發中&#xff0c;命令行界面&#xff08;CLI&#xff09;的設計與交互至關重要。Click是一個強大的Python庫&#xff0c;專門用于快速創建命令行界面&#xff0c;以其簡單易用性和豐富的功能贏得了開發者的青睞。本文將…

[SAP ABAP] Debug Skill

SAP ABAP Debug相關資料 [SAP ABAP] DEBUG ABAP程序中的循環語句 [SAP ABAP] 靜態斷點的使用 [SAP ABAP] 在ABAP Debugger調試器中設置斷點 [SAP ABAP] SE11 / SE16N 修改標準表(慎用)

kamailio-Core 說明書 版本:Kamailio SIP Server v6.0.x(穩定版)

Core 說明書 版本&#xff1a;Kamailio SIP Server v6.0.x&#xff08;穩定版&#xff09; 概述 本教程收集了 Kamailio 導出的函數和參數 core 添加到配置文件中。 注意&#xff1a;此頁面上的參數不按字母順序排列。 結構 kamailio.cfg 的結構可以看作是三個部分&#xff…

.Net / C# 繁體中文 與 簡體中文 互相轉換, 支持地方特色詞匯

版本號 Nuget 搜索 “OpenCCNET”, 注意別找錯, 好多庫的名字都差不多 支持 “繁,簡” 的互相轉換, 支持多個地區常用詞匯的轉換, 還支持 日文的新舊轉換. OpenCC 在 .Net 中的實現 https://github.com/CosineG/OpenCC.NET <PackageReference Include"OpenCCNET"…

Redis腦裂問題詳解及解決方案

Redis是一種高性能的內存數據庫&#xff0c;廣泛應用于緩存、消息隊列等場景。然而&#xff0c;在分布式Redis集群中&#xff0c;腦裂問題&#xff08;Split-Brain&#xff09;是一個需要特別關注的復雜問題。本文將詳細介紹Redis腦裂問題的成因、影響及解決方案。 一、什么是…

LLMs之OpenAI o系列:OpenAI o3-mini的簡介、安裝和使用方法、案例應用之詳細攻略

LLMs之OpenAI o系列&#xff1a;OpenAI o3-mini的簡介、安裝和使用方法、案例應用之詳細攻略 目錄 相關文章 LLMs之o3&#xff1a;《Deliberative Alignment: Reasoning Enables Safer Language Models》翻譯與解讀 LLMs之OpenAI o系列&#xff1a;OpenAI o3-mini的簡介、安…

女生年薪12萬,算不算屬于高收入人群

在繁華喧囂的都市中&#xff0c;我們時常會聽到關于收入、高薪與生活質量等話題的討論。尤其是對于年輕女性而言&#xff0c;薪資水平不僅關乎個人價值的體現&#xff0c;更直接影響到生活質量與未來的規劃。那么&#xff0c;女生年薪12萬&#xff0c;是否可以被劃入高收入人群…

AI開發學習之——PyTorch框架

PyTorch 簡介 PyTorch &#xff08;Python torch&#xff09;是由 Facebook AI 研究團隊開發的開源機器學習庫&#xff0c;廣泛應用于深度學習研究和生產。它以動態計算圖和易用性著稱&#xff0c;支持 GPU 加速計算&#xff0c;并提供豐富的工具和模塊。 PyTorch的主要特點 …

Python安居客二手小區數據爬取(2025年)

目錄 2025年安居客二手小區數據爬取觀察目標網頁觀察詳情頁數據準備工作&#xff1a;安裝裝備就像打游戲代碼詳解&#xff1a;每行代碼都是你的小兵完整代碼大放送爬取結果 2025年安居客二手小區數據爬取 這段時間需要爬取安居客二手小區數據&#xff0c;看了一下相關教程基本…

OpenCV:開運算

目錄 1. 簡述 2. 用腐蝕和膨脹實現開運算 2.1 代碼示例 2.2 運行結果 3. 開運算接口 3.1 參數詳解 3.2 代碼示例 3.3 運行結果 4. 開運算應用場景 5. 注意事項 6. 總結 相關閱讀 OpenCV&#xff1a;圖像的腐蝕與膨脹-CSDN博客 OpenCV&#xff1a;閉運算-CSDN博客 …

JavaWeb入門-請求響應(Day3)

(一)請求響應概述 請求(HttpServletRequest):獲取請求數據 響應(HttpServletResponse):設置響應數據 BS架構:Browser/Server,瀏覽器/服務器架構模式。客戶端只需要瀏覽器就可訪問,應用程序的邏輯和數據都存儲在服務端(維護方便,響應速度一般) CS架構:Client/ser…

【SLAM】于AutoDL云上GPU運行GCNv2_SLAM的記錄

配置GCNv2_SLAM所需環境并實現AutoDL云端運行項目的全過程記錄。 本文首發于?慕雪的寒舍 1. 引子 前幾天寫了一篇在本地虛擬機里面CPU運行GCNv2_SLAM項目的博客&#xff1a;鏈接&#xff0c;關于GCNv2_SLAM項目相關的介紹請移步此文章&#xff0c;本文不再重復說明。 GCNv2:…

羅格斯大學:通過輸入嵌入對齊選擇agent

&#x1f4d6;標題&#xff1a;AgentRec: Agent Recommendation Using Sentence Embeddings Aligned to Human Feedback &#x1f310;來源&#xff1a;arXiv, 2501.13333 &#x1f31f;摘要 &#x1f538;多代理系統必須決定哪個代理最適合給定的任務。我們提出了一種新的架…

【實戰篇】Android安卓本地離線實現視頻檢測人臉

實戰篇Android安卓本地離線實現視頻檢測人臉 引言項目概述核心代碼類介紹人臉檢測流程項目地址總結 引言 在當今數字化時代&#xff0c;人臉識別技術已經廣泛應用于各個領域&#xff0c;如安防監控、門禁系統、移動支付等。本文將以第三視角詳細講解如何基于bifan-wei-Face/De…

團體程序設計天梯賽-練習集——L1-025 正整數A+B

一年之際在于春&#xff0c;新年的第一天&#xff0c;大家敲代碼了嗎&#xff1f;哈哈 前言 這道題分值是15分&#xff0c;值這個分&#xff0c;有一小點運算&#xff0c;難度不大&#xff0c;雖然說做出來了&#xff0c;但是有兩個小疑點。 L1-025 正整數AB 題的目標很簡單…