13.代理模式(Proxy Pattern)

定義

代理模式(Proxy Pattern) 是一種結構型設計模式,它通過提供一個代理對象來控制對目標對象的訪問。代理對象作為客戶端與目標對象之間的中介,間接地訪問目標對象的功能。代理模式可以在不改變目標對象的情況下增加一些額外的功能,如延遲加載、安全控制、日志記錄等。

基本思想

代理對象:代理模式引入了一個中介對象(代理對象)來訪問真實的對象。代理對象控制對真實對象的訪問,并可以在訪問真實對象之前或之后加入額外的功能。
目標對象:代理模式的核心是需要被代理的對象,它實現了實際的業務邏輯。
客戶端:客戶端通過代理對象間接調用目標對象的方法,而不直接訪問目標對象。

適用場景

代理模式適用于以下場景:

  • 控制訪問:當需要控制對某個對象的訪問時,可以使用代理模式。比如,代理模式可以限制某些操作,或者在目標對象沒有初始化時,延遲加載目標對象。
  • 延遲加載:在需要時才創建目標對象,而不是在系統初始化時創建,這樣可以節省資源。
  • 緩存:通過代理模式,代理對象可以緩存目標對象的結果,避免重復計算。
  • 日志記錄:代理對象可以在方法執行前后記錄日志,確保目標對象的行為被正確監控。
  • 遠程訪問:代理模式可用于實現遠程訪問對象,客戶端與代理對象交互,而代理對象負責與遠程目標對象進行通信。

類設計

代碼實現解析

  1. 設計目標:代理模式實現任務處理
    我們設計一個簡單的場景,其中 ISubject 是任務處理接口,RealSubject 是具體的任務處理類,SubjectProxy 是代理類,它負責對 RealSubject 的間接訪問。
#include <iostream>
#include <string>
using namespace std;// 定義Subject接口
class ISubject {
public:virtual void process() = 0;virtual ~ISubject() {}
};// 真實主題類(RealSubject)
class RealSubject : public ISubject {
public:void process() override {cout << "RealSubject: Processing the task." << endl;}
};// 代理類(SubjectProxy)
class SubjectProxy : public ISubject {
private:RealSubject* realSubject;public:SubjectProxy() : realSubject(nullptr) {}void process() override {// 代理對象在訪問目標對象之前做一些處理(如延遲加載、權限檢查等)cout << "Proxy: Checking access rights..." << endl;if (!realSubject) {// 延遲加載目標對象realSubject = new RealSubject();cout << "Proxy: Creating RealSubject instance..." << endl;}// 代理對象調用真實主題的方法realSubject->process();}~SubjectProxy() {delete realSubject;  // 確保釋放真實主題對象的資源}
};// 客戶端類
class ClientApp {
private:ISubject* subject;public:ClientApp() {subject = new SubjectProxy();  // 客戶端通過代理類訪問任務}void DoTask() {// 客戶端通過代理對象執行任務subject->process();}~ClientApp() {delete subject;}
};int main() {ClientApp app;app.DoTask();  // 通過代理對象處理任務return 0;
}

輸出:

Proxy: Checking access rights...
Proxy: Creating RealSubject instance...
RealSubject: Processing the task.客戶端通過 ClientApp 調用 subject->process(),
但實際執行的是通過 SubjectProxy 代理對象的 process() 方法。代理對象首先檢查訪問權限(這里是模擬操作),
然后如果目標對象尚未創建,則延遲創建 RealSubject 實例并執行任務。

類設計分析

1.ISubject(接口/抽象類)

  • 定義了代理類和真實對象共同的接口。在本例中,process() 方法是客戶端與代理類和真實類交互的唯一方式。

2.RealSubject(真實主題)

  • RealSubject 是實際執行任務的類,它提供了業務邏輯的實現。
  • 在 process() 方法中,RealSubject 處理實際的任務。

3.SubjectProxy(代理類):

  • 代理類實現了 ISubject 接口,負責控制對 RealSubject 的訪問。代理類可以在調用 RealSubject 的方法之前執行一些操作(如延遲加載、權限驗證、日志記錄等)。
  • 在 process() 方法中,代理對象會檢查是否已經創建了 RealSubject 實例,如果沒有,則創建一個實例并調用 process()。

4.ClientApp(客戶端):

  • 客戶端通過 ISubject 接口與 SubjectProxy(代理對象)交互,而不直接與 RealSubject 進行交互。客戶端只調用 process() 方法,而無需關心代理對象如何處理目標對象的訪問。

代理模式的優缺點

優點:

  • 控制訪問:代理模式可以控制對目標對象的訪問,并增加附加功能,如懶加載、日志、權限驗證等。
  • 提高效率:通過延遲加載(懶加載),可以在需要時才創建目標對象,從而節省資源。
  • 解耦:客戶端不需要直接與目標對象交互,代理類充當了客戶端和目標對象之間的中介,降低了系統的耦合性。
  • 附加功能:可以在代理類中為目標對象添加額外的功能,如緩存、日志、權限檢查等,而不修改目標對象的代碼。

缺點

  • 增加復雜度:代理模式通過引入額外的類增加了系統的復雜度,特別是在目標對象復雜時。
  • 性能開銷:代理類通常會引入一定的性能開銷,尤其是在頻繁的代理操作中,可能會影響系統的性能。
  • 不可避免的代理層:代理模式在某些情況下可能導致不必要的中間層,尤其是當目標對象的接口已經足夠簡潔時。

適用場景

代理模式適用于以下場景:

  • 延遲加載:當對象的創建成本較高時,可以使用代理模式進行延遲加載。
  • 訪問控制:當需要對目標對象的訪問進行控制時(如權限驗證、緩存等),可以使用代理模式。
  • 資源保護:代理模式可用于保護目標對象的資源,如防止頻繁創建和銷毀實例。
  • 遠程代理:在分布式系統中,代理模式可以用來控制客戶端與遠程對象之間的通信。

常見應用場景:

  • 虛擬代理:延遲加載目標對象,直到真正需要它時才創建實例。
  • 保護代理:限制客戶端對某些操作的訪問,進行權限檢查。
  • 遠程代理:客戶端通過代理與遠程對象進行交互,代理負責與遠程服務器通信。
  • 智能代理:增加一些額外的功能,如緩存、日志、事務管理等。

總結

代理模式通過引入代理類,允許客戶端通過代理間接訪問目標對象,并能在不改變目標對象的情況下,增加一些額外的功能,如延遲加載、訪問控制、日志記錄等。代理模式能有效地解耦客戶端和目標對象,簡化客戶端與目標對象之間的交互,同時增加系統的靈活性。

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

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

相關文章

DBeaver連接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)的解決方法

在使用DBeaver連接MySQL數據庫時&#xff0c;如果遇到“Access denied for user ip (using password: YES)”的錯誤提示&#xff0c;說明用戶認證失敗。此問題通常與數據庫用戶權限、配置錯誤或網絡設置有關。本文將詳細介紹解決此問題的步驟。 一、檢查用戶名和密碼 首先&am…

Python進行模型優化與調參

在數據科學與機器學習領域,模型的優化與調參是提高模型性能的重要步驟之一。模型優化可以幫助提高模型的準確性和泛化能力,而合理的調參則能夠充分發揮模型的潛力。這篇教程將重點介紹幾種常用的模型優化與調參方法,特別是超參數調整和正則化技術的應用。這些技術能夠有效地…

Verilog基礎(三):過程

過程(Procedures) - Always塊 – 組合邏輯 (Always blocks – Combinational) 由于數字電路是由電線相連的邏輯門組成的,所以任何電路都可以表示為模塊和賦值語句的某種組合. 然而,有時這不是描述電路最方便的方法. 兩種always block是十分有用的: 組合邏輯: always @(…

2024年12月 Scratch 圖形化(一級)真題解析 中國電子學會全國青少年軟件編程等級考試

202412 Scratch 圖形化&#xff08;一級&#xff09;真題解析 中國電子學會全國青少年軟件編程等級考試 一、單選題(共25題&#xff0c;共50分) 第 1 題 點擊下列哪個按鈕&#xff0c;可以將紅框處的程序放大&#xff1f;&#xff08; &#xff09; A. B. C. D. 標…

C++【深入 STL--list 之 迭代器與反向迭代器】

接前面的手撕list(上)文章&#xff0c;由于本人對于list的了解再一次加深。本文再次對list進行深入的分析與實現。旨在再一次梳理思路&#xff0c;修煉代碼內功。 1、list 基礎架構 list底層為雙向帶頭循環鏈表&#xff0c;問題是如何來搭建這個list類。可以進行下面的考慮&am…

如何打開vscode系統用戶全局配置的settings.json

&#x1f4cc; settings.json 的作用 settings.json 是 Visual Studio Code&#xff08;VS Code&#xff09; 的用戶配置文件&#xff0c;它存儲了 編輯器的個性化設置&#xff0c;包括界面布局、代碼格式化、擴展插件、快捷鍵等&#xff0c;是用戶全局配置&#xff08;影響所有…

wordpress外貿獨立站常用詢盤軟件

LiveChat LiveChat是一家提供實時聊天軟件的公司&#xff0c;幫助企業通過其平臺與客戶進行即時通訊&#xff0c;提高客戶滿意度和忠誠度。他們的產品允許企業在網站、應用程序或電子郵件等多個渠道與客戶互動&#xff0c;從而提升客戶體驗并促進銷售增長。 LiveChat的軟件特…

STM32 ADC模數轉換器

ADC簡介 ADC&#xff08;Analog-Digital Converter&#xff09;模擬-數字轉換器 ADC可以將引腳上連續變化的模擬電壓轉換為內存中存儲的數字變量&#xff0c;建立模擬電路到數字電路的橋梁 12位逐次逼近型ADC&#xff0c;1us轉換時間 輸入電壓范圍&#xff1a;0~3.3V&#xff0…

(2025,LLM,下一 token 預測,擴散微調,L2D,推理增強,可擴展計算)從大語言模型到擴散微調

Large Language Models to Diffusion Finetuning 目錄 1. 概述 2. 研究背景 3. 方法 3.1 用于 LM 微調的高斯擴散 3.2 架構 4. 主要實驗結果 5. 結論 1. 概述 本文提出了一種新的微調方法——LM to Diffusion (L2D)&#xff0c;旨在賦予預訓練的大語言模型&#xff08;…

DeepSeek 與 ChatGPT 對比分析

一、技術背景與研發團隊 ChatGPT 由 OpenAI 開發&#xff0c;自 2015 年 OpenAI 成立以來&#xff0c;經過多年的技術積累和迭代&#xff0c;從 GPT-1 到 GPT-4o&#xff0c;每一次升級都帶來了技術上的突破。OpenAI 擁有雄厚的技術實力和海量的數據、強大的算力支持&#xff…

學習threejs,pvr格式圖片文件貼圖

&#x1f468;??? 主頁&#xff1a; gis分享者 &#x1f468;??? 感謝各位大佬 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;??? 收錄于專欄&#xff1a;threejs gis工程師 文章目錄 一、&#x1f340;前言1.1 ??PVR貼圖1.2 ??THREE.Mesh…

DeepSeek R1技術報告關鍵解析(8/10):DeepSeek-R1 的“aha 時刻”,AI 自主學習的新突破

1. 什么是 AI 的“aha 時刻”&#xff1f; 在強化學習過程中&#xff0c;AI 的推理能力并不是線性增長的&#xff0c;而是會經歷一些關鍵的“頓悟”時刻&#xff0c;研究人員將其稱為“aha 時刻”。 這是 AI 在訓練過程中突然學會了一種新的推理方式&#xff0c;或者能夠主動…

python:遞歸函數與lambda函數

遞歸函數&#xff1a;1.函數內調用自己 2.有一個出口 1.遞歸 一.有出口時 def sum(num):if num1:return 1return numsum(num-1) asum(3) print(a) #num3 3sum(2) #num2 2sum(1) #num1是返回1 #即3sum(2&#xff09;即32sum(1)即321運行結果 6 二.無出口時 def sum(num)…

ABB 3BSE018741R30 帶插頭連接器的電纜

產品ID:3BSE018741R30 ABB型號名稱:PFTL 101/201/PFCL 201 30米 目錄描述:帶插頭連接器的電纜&#xff0c;30米 ABB型號名稱:PFTL 101/201/PFCL 201 30米 核心信用:0.00 原產國:瑞典波蘭 海關稅則號:85389091 框架尺寸:備件 毛重:5公斤 媒體描述:帶插頭連接器的電纜 最小訂購數…

SpringMVC請求

一、RequestMapping注解 RequestMapping注解的作用是建立請求URL和處理方法之間的對應關系 RequestMapping注解可以作用在方法和類上 1. 作用在類上&#xff1a;第一級的訪問目錄 2. 作用在方法上&#xff1a;第二級的訪問目錄 3. 細節&#xff1a;路徑可以不編寫 / 表示應…

VUE的響應性調試:組件調試鉤子、計算屬性調試、偵聽器調試【僅會在開發模式下工作】

文章目錄 引言I 組件調試鉤子調試事件對象的類型定義鉤子II 計算屬性調試例子回調函數說明III 偵聽器調試引言 VUE的響應性調試的使用場景:確切地知道Vue 的響應性系統正在跟蹤什么,或者是什么導致了組件重新渲染。 I 組件調試鉤子 組件調試鉤子僅會在開發模式下工作 調試…

tkvue 入門,像寫html一樣寫tkinter

介紹 沒有官網&#xff0c;只有例子 安裝 像寫vue 一樣寫tkinter 代碼 pip install tkvue作者博客 修改樣式 import tkvue import tkinter.ttk as ttktkvue.configure_tk(theme"clam")class RootDialog(tkvue.Component):template """ <Top…

藍橋杯試題:排序

一、問題描述 給定 nn 個正整數 a1,a2,…,ana1?,a2?,…,an?&#xff0c;你可以將它們任意排序。現要將這 nn 個數字連接成一排&#xff0c;即令相鄰數字收尾相接&#xff0c;組成一個數。問&#xff0c;這個數最大可以是多少。 輸入格式 第一行輸入一個正整數 nn&#xff…

Java—不可變集合

不可變集合&#xff1a;不可以被修改的集合 創建不可變集合的應用場景 如果某個數據不能被修改&#xff0c;把它防御性地拷貝到不可變集合中是個很好的實踐。當集合對象被不可信的庫調用時&#xff0c;不可變形式是安全的。 簡單理解&#xff1a;不想讓別人修改集合中的內容…

每日Attention學習18——Grouped Attention Gate

模塊出處 [ICLR 25 Submission] [link] UltraLightUNet: Rethinking U-shaped Network with Multi-kernel Lightweight Convolutions for Medical Image Segmentation 模塊名稱 Grouped Attention Gate (GAG) 模塊作用 輕量特征融合 模塊結構 模塊特點 特征融合前使用Group…