C++設計模式結構型之代理模式


一、概述
?? ?代理模式是一種結構型模式,在很多不同的場合具有廣泛的分類和應用。其主要實現的思想是在客戶端和真正要訪問的對象之間引入一個
代理對象(間接層),于是,以往客戶端對真正對象的訪問現在變成了通過代理對象進行訪問,代理對象在這里起到了一個中介或者橋梁作用。
引入代理對象的目的主要是可以為客戶端增加額外的功能、約束或者針對客戶端的調用屏蔽一些復雜的細節問題。

二、基本概念與示例
?? ?代理模式的實質是通過引入一個代理類來為原始類(被代理類)增加額外的能力,這些額外的能力可能是指一些新功能、新服務,也可能
是一些約束或者限制等。那么現在試著考慮一個例子,通過瀏覽器訪問某個網站,最簡單的方式就是在瀏覽器中輸入網站的地址來直接訪問。

class CWebAddr
{
public:
?? ?virtual void visit() = 0;
?? ?virtual ~CWebAddr(){}
};

class CWebAddr_Shopping : public CWebAddr
{
public:
?? ?virtual void visit()
?? ?{
?? ??? ?//訪問購物網站復雜通信邏輯
?? ??? ?cout << "訪問CWebAddr_Shopping購物網站" << endl;
?? ?}
};

class CWebAddr_Video : public CWebAddr
{
public:
?? ?virtual void visit()
?? ?{
?? ??? ?//訪問視頻網站復雜通信邏輯
?? ??? ?cout << "訪問CWebAddr_Video視頻網站" << endl;
?? ?}
};

//主函數
int main()
{
?? ?CWebAddr *pShopping = new CWebAddr_Shopping();
?? ?pShopping->visit();
?? ?
?? ?CWebAddr *pVideo = new CWebAddr_Video();
?? ?pVideo->visit();
?? ?
?? ?delete pShopping;
?? ?delete pVideo;
?? ?
?? ?return 0;
}

上述代碼執行結果沒問題,描述主要是直接訪問某個或者某些網站,那么我們也可以引入代理類幫助我們訪問這些網站,
針對以上代碼做出調整:
class CWebAddrProxy : public CWebAddr
{
public:
?? ?CWebAddrProxy(CWebAddr* pWebAddr) : m_webAddr(pWebAddr){}
?? ?
public:
?? ?virtual void visit()
?? ?{?? ?
?? ??? ?m_webAddr->visit();
?? ?}
private:
?? ?CWebAddr* m_webAddr;?? ?
};

//主函數
int main()
{
?? ?CWebAddr *pShopping = new CWebAddr_Shopping();
?? ?CWebAddr *pVideo = new CWebAddr_Video();
?? ?
?? ?CWebAddrProxy *pWebproxy1 = new CWebAddrProxy(pShopping);
?? ?pWebproxy1->visit();
?? ?
?? ?CWebAddrProxy *pWebproxy2 = new CWebAddrProxy(pVideo);
?? ?pWebproxy2->visit();
?? ??? ?
?? ?delete pShopping;
?? ?delete pVideo;
?? ?delete pWebproxy1;
?? ?delete pWebproxy2;
?? ?
?? ?return 0;
}

三、代理模式定義與角色
?? ?引入代理模式的定義:為其他對象提供一種代理,以控制對這個對象的訪問。代理模式通過創建代理對象來代表真實對象,客戶端操作代理
對象與操作真實對象并沒有什么不同。當然,最核心、最本質的功能,最終還是需要代理對象操縱真實對象來完成。
代理模式UML圖中涉及三個角色:
(1)Subject(抽象對象)。該類定義真實主題與代理主題的共同接口,這樣,在真實主題的地方都可以使用代理主題。
(2)Proxy(代理主題)。該類內部包含了對真實主題的引用,從而可以對真實主題進行訪問。代理主題中一般會提供與真實主題相同的接口,以
達到可以取代真實主題的目的。同時也可以對真實主題的訪問進行約束和限制,也能夠控制必要時的創建/刪除真實主題。
(3)RealSubject(真實主題)定義代理主題代表的真實對象,真正的業務是在真實主題中實現的,客戶端通過代理主題間接訪問真實主題中的
接口。

四、代理模式的應用場合
?? ?代理模式UML圖分廠簡單,總結起來也簡單----在軟件設計中,增加間接層來獲取更大的靈活性和增加更多的控制。在實際中,代理模式可能
會在許多場合得到應用,并且其實現可能會非常復雜。
1)遠程代理
2)虛擬代理
3)保護代理
4)緩存/緩沖代理
5)智能引用代理
6)寫時復制優化代理

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

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

相關文章

數學建模-規劃工具箱yalmip

官網下載 實例 %% yalmip 求解 yalmip clc;clear;close all; %% %sdpvar實型變量 intvar 整形變量 binvar 0-1型變量 psdpvar(3,1); %定義變量 %目標函數 要把求最大值轉化為最小值 Objective-p(1)^2p(2)^2-p(2)*p(3);%約束條件 Constraints[0<p<1,(p(1)^2p…

音視頻FAQ(一):視頻直播卡頓

一、摘要 本文介紹了視頻直播卡頓的四個主要原因&#xff0c;用戶網絡問題、用戶設備性能問題、技術路線的選擇和實現問題。因本文主要闡述視頻直播的卡頓&#xff0c;故技術路線的實現指的是&#xff1a;CDN供應商的實現問題&#xff0c;包含CDN性能不足、CDN地區覆蓋不足。對…

Vc - Qt - 繪制窗口背景色

要在Qt中繪制一個背景顏色&#xff0c;你可以使用Qt的繪圖功能來完成。下面是一種簡單的方法&#xff1a; 步驟1&#xff1a;在你想要繪制背景顏色的QWidget&#xff08;例如QMainWindow或QDialog&#xff09;的派生類中&#xff0c;重寫 它的paintEvent函數。步驟2&#xff1a…

matlab中exp和expm的區別

exp()為數組 X 中的每個元素返回指數 e x e^{x} ex expm()計算 X 的矩陣指數。 兩個函數傳入矩陣后計算的結果是不同的&#xff0c;千萬不能混淆。之前曾經想當然得把exp里傳入矩陣當矩陣指數使用&#xff0c;也未驗證正確性&#xff0c;實不應該。

uni-app中使用pinia

目錄 Pinia 是什么&#xff1f; uni-app 使用Pinia main.js 中引用pinia 創建和注冊模塊 定義pinia方式 選項options方式 定義pinia 頁面中使用 pinia選項options方式 函數方式 定義pinia 頁面中使用 函數方式 定義的pinia Pinia 是什么&#xff1f; Pinia&#xff0…

用戶新增預測——baseline學習筆記

一、賽題理解 1. 賽題名稱 用戶新增預測挑戰賽 2. 賽題數據集 賽題數據由約62萬條訓練集、20萬條測試集數據組成&#xff0c;共包含13個字段。其中uuid為樣本唯一標識&#xff0c;eid為訪問行為ID&#xff0c;udmap為行為屬性&#xff0c;其中的key1到key9表示不同的行為屬性…

S-Video端口接口芯片ESD保護方案圖

在音/視頻領域&#xff0c;除了常見的HDMI、DVI接口等&#xff0c;還有一些冷門的接口&#xff0c;比如S-Video端口&#xff0c;相信很多人可能都沒有聽說過。S-Video視頻端口同樣擁有較好的數據傳輸功能。S-Video二分量視頻端口&#xff0c;英文全稱Separate Video&#xff0c…

Macbook 終端 git 命令補全和提示

Mac OS自帶的終端&#xff0c;用起來雖然有些不太方便&#xff0c;界面也不夠友好&#xff0c;關鍵是在windows上用習慣了自動補全功能&#xff0c;在Mac上一個個的拼寫單詞是真的難受&#xff0c;逼著我記英文單詞。 經過一天的磨合&#xff0c;我實在忍不了&#xff0c;在網上…

復習vue3,簡簡單單記錄

這里的知識是結合視頻以及其他文章一起學習&#xff0c;僅用于個人復習記錄 ref 和reactive ref 用于基本類型 reactive 用于引用類型 如果使用ref 傳遞對象&#xff0c;修改值時候需要寫為obj.value.attr 方式修改屬性值 如果使用reactive 處理對象&#xff0c;直接obj.att…

Lua學習記錄

Lua基礎了解 Lua的注釋通過 (-- 單行注釋&#xff0c;--[[ ]] 多行注釋)可以不加&#xff1b; 多個變量賦值&#xff0c;按順序賦值&#xff0c;沒有則為nil&#xff1b; function的簡單用法&#xff0c;多個返回值配合多重賦值&#xff0c;以end為結束標志 Lua下標從1開始&…

JSP-學習筆記

文章目錄 1.JSP介紹2 JSP快速入門3 JSP 腳本3.1 JSP腳本案例3.2 JSP缺點 4 EL表達式4.1 快速入門案例 5. JSTL標簽6. MVC模式和三層架構6.1 MVC6.2 三層架構 7. 案例-基于MVC和三層架構實現商品表的增刪改查 1.JSP介紹 概念 JSP&#xff08;JavaServer Pages&#xff09;是一種…

Azure存儲賬戶

存儲賬戶的概念 Azure存儲賬戶是Azure提供的一種云存儲解決方案&#xff0c;用于存儲和訪問各種類型的數據&#xff0c;包括文件、磁盤、隊列、表格和Blob&#xff08;二進制大對象&#xff09;數據。存儲賬戶可以基于訪問模式和冗余需求來選擇不同的類型&#xff0c;以滿足應…

【MySQL--->表的操作】

文章目錄 [TOC](文章目錄) 一、創建表二、查看表三、修改表四、刪除表drop table 表名; ![在這里插入圖片描述](https://img-blog.csdnimg.cn/15227b8335364d41bd01b4b4dd83ee55.png) 一、創建表 語句格式:create table 表名(列名 類型,…)字符集 校驗規則 存儲引擎;字符集和校…

我還不知道?Android組件化插件化模塊化

Android組件化、插件化和模塊化是針對Android應用程序開發的一種架構設計思想和開發方式。 組件化&#xff08;Componentization&#xff09;&#xff1a; 組件化是將一個大型的Android應用程序拆分成多個獨立的組件&#xff08;Module&#xff09;&#xff0c;每個組件可以獨…

python使用裝飾器記錄方法耗時

思路 python使用修飾器記錄方法耗時&#xff0c;目的是每當方法執行完后&#xff0c;可以記錄該方法耗時&#xff0c;而不需要在每個方法的執行前后&#xff0c;去創建一個臨時變量&#xff0c;來記錄耗時。 方式一&#xff08;不推薦&#xff09;&#xff1a; 在每個方法的…

source insight 添加宏-文件頭加注釋

source insight 3.5 自帶的一些宏&#xff0c;在安裝目錄下的 utils.em 文件中&#xff0c;用戶也可以自己寫文件&#xff0c;命令為xxx.em &#xff0c;然后把這個文件添加到項目中即可&#xff0c;添加后在菜單欄 Options -> Key Assignments 里輸入macro 就能顯示新添加的…

第一個ArkTS項目實踐-鴻蒙ArkTS

第一個ArkTS項目實踐-ArkTS 第一個ArkTS項目實踐-ArkTS自定義組件的組成配置屬性與布局配置屬性布局 改變組件狀態循環渲染列表數據代碼ToDoItem組件ToDoList頁面 效果參考資料 第一個ArkTS項目實踐-ArkTS 本篇文章是官網上視頻對ArkTS開發實踐的第一個視頻&#xff0c;主要是引…

Matplotlib數據可視化(三)

目錄 1.繪圖的填充 1.1 曲線下方區域的填充 1.2 填充部分區域 1.3 兩條曲線之間的區域填充 1.4 直接使用fill進行填充 1.繪圖的填充 繪圖的填充可以調用fill_between()或fill()進行填充。 1.1 曲線下方區域的填充 x np.linspace(0,1,500) y np.sin(3*np.pi*x)*np.exp…

【C語言】每日一題(找到所有數組中消失的數字)

找到所有數組中消失的數字&#xff0c;鏈接奉上。 這里簡單說一下&#xff0c;因為還沒有接觸到動態內存&#xff0c;數據結構&#xff0c;所以知識有限&#xff0c;也是盡力而為&#xff0c;結合題庫的評論區找到了適合我的解法&#xff0c;以后有機會&#xff0c;會補上各種…

如何在HTML中使用React

突發奇想 查了查真的可以,官方文檔: 在網站中添加 React – React 開始 引入js <!-- 開發環境使用 --><script src"https://unpkg.com/react18/umd/react.development.js"></script><script src"https://unpkg.com/react-dom18/umd/reac…