C# 設計模式(結構型模式):代理模式

C# 設計模式(結構型模式):代理模式

在軟件開發中,有時我們需要通過某種方式間接地訪問一個對象,這時就可以使用代理模式(Proxy Pattern)。代理模式通過引入一個代理對象來控制對目標對象的訪問,代理對象可以在訪問目標對象時進行一些額外的處理,比如延遲加載、安全控制、訪問權限檢查等。

1. 代理模式的定義

代理模式是一種結構型設計模式,主要用于為其他對象提供一種代理以控制對該對象的訪問。代理對象通常與真實對象具有相同的接口,客戶端通過代理對象來間接訪問真實對象。代理模式可以分為幾種類型:虛擬代理、遠程代理、保護代理等,每種類型的代理對象都有不同的應用場景。

2. 代理模式的結構

代理模式通常包括以下幾個部分:

  • Subject(主題接口):定義了真實對象和代理對象都必須實現的接口。通常,它會包含一些具體的業務操作方法。
  • RealSubject(真實主題):實現了 Subject 接口,表示實際需要訪問的對象。
  • Proxy(代理類):實現了 Subject 接口,通過代理類來控制對真實主題的訪問。
  • Client(客戶端):通過代理對象來調用真實對象的操作,而不直接引用真實對象。
3. 代理模式的應用場景

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

  • 延遲加載:當我們需要在某些情況下才加載目標對象時,可以使用虛擬代理來延遲目標對象的創建。
  • 訪問控制:代理模式可以用來控制對目標對象的訪問權限,比如為目標對象添加權限檢查。
  • 遠程代理:在分布式系統中,代理模式可以用來表示一個遠程對象。
  • 緩存:代理模式可以用來緩存目標對象的返回結果,提高性能。
4. C# 實現代理模式

假設我們有一個文件下載的應用,需要通過代理來控制文件的加載。當文件第一次被請求時,我們可以通過代理來加載文件,而在之后的請求中,直接返回緩存的內容。這是一個常見的虛擬代理模式的應用場景。

using System;// 主題接口
public interface IFile
{void Download();
}// 真實主題:文件下載
public class RealFile : IFile
{private string fileName;public RealFile(string fileName){this.fileName = fileName;}public void Download(){Console.WriteLine($"Downloading {fileName}...");}
}// 代理類:控制文件下載的訪問
public class ProxyFile : IFile
{private RealFile realFile;private string fileName;public ProxyFile(string fileName){this.fileName = fileName;}public void Download(){// 如果是真正的文件,進行下載;否則,代理只進行緩存。if (realFile == null){realFile = new RealFile(fileName);Console.WriteLine("Initializing file download...");}else{Console.WriteLine("Using cached file.");}realFile.Download();}
}// 客戶端代碼
class Program
{static void Main(string[] args){IFile file1 = new ProxyFile("File1.txt");file1.Download();  // 第一次下載,代理會初始化文件并下載file1.Download();  // 第二次下載,代理直接使用緩存IFile file2 = new ProxyFile("File2.txt");file2.Download();  // 第一次下載,代理會初始化文件并下載}
}

在這個例子中:

  • IFile 是主題接口,定義了文件下載的 Download 方法。
  • RealFile 是真實主題,表示需要被代理的文件下載對象。
  • ProxyFile 是代理類,它在第一次請求時初始化并加載 RealFile,之后則使用緩存的文件。

通過代理模式,客戶端無需關心文件是否已經下載,代理類會自動處理文件的加載和緩存,提高了系統的效率。

5. 代理模式的優缺點

優點

  • 靈活性高:代理類可以控制對目標對象的訪問,添加延遲加載、緩存、權限控制等功能。
  • 不改變真實對象:通過代理類,我們可以在不修改真實對象代碼的前提下,為目標對象添加額外的功能。
  • 增強系統性能:代理可以用來緩存目標對象的結果,減少不必要的計算或I/O操作,從而提高性能。

缺點

  • 增加了系統復雜性:引入代理類可能會增加系統的復雜性,尤其是當代理類的數量增多時。
  • 性能開銷:代理類需要處理額外的操作,如緩存、權限控制等,可能會引入一些性能開銷。
6. 總結

代理模式是一個強大的設計模式,特別適用于控制對象的訪問、延遲加載、權限檢查等場景。通過代理類,我們可以在不修改真實對象的情況下,為其添加額外的功能,從而增強系統的靈活性和可維護性。在處理遠程調用、緩存和訪問控制等問題時,代理模式能夠提供非常有效的解決方案。


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

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

相關文章

關于AI面試系統2025年趨勢評估!

在快速發展的科技浪潮中,AI技術正以前所未有的速度滲透到各行各業。企業招聘領域,作為人才選拔的關鍵環節,也不例外地迎來了AI面試系統的廣泛應用和持續創新。2025年,AI面試系統不僅成為企業招聘的主流工具,更在智能化…

MySQL 01 02 章——數據庫概述與MySQL安裝篇

一、數據庫概述 (1)為什么要使用數據庫 數據庫可以實現持久化,什么是持久化:數據持久化意味著將內存中的數據保存到硬盤上加以“固化”持久化的主要作用是:將內存中的數據存儲在關系型數據庫中,當然也可以…

Linux 揮別 WinXP 時代協議,USB RNDIS 即將退場

IT之家 1 月 2 日消息,Linux 基金會研究員 Greg Kroah-Hartman 計劃在 Linux 內核中,徹底移除 USB RNDIS 協議驅動。 IT之家查詢公開資料,USB RNDIS 是一種遠程網絡驅動接口規范,將 USB 設備模擬成網卡,從而在計算機和…

Vue3 組件

文章目錄 Vue3 組件概述根組件定義和使用組件樣式控制全局樣式局部樣式深度樣式 Vue3 組件 概述 組件允許我們將 UI 劃分為獨立的、可重用的部分,并且可以對每個部分進行單獨的思考。在實際應用中,組件常常被組織成層層嵌套的樹狀結構: 根…

怎么在家訪問公司服務器?

在日常工作中,特別是對信息技術從業者而言,工作往往離不開公司的服務器。他們需要定期訪問服務器,獲取一些關鍵的機密文件或數據。如果您在家辦公,并且需要處理未完成的任務,同時需要從公司服務器獲取所需的數據&#…

AI 自動化編程對編程教育的影響

AI 自動化編程的未來 引言 你是否曾想過,未來的程序員需要掌握哪些技能呢?隨著人工智能的迅猛發展,特別是生成式AI工具的普及,編程的世界正在發生翻天覆地的變化。編程教育也在這種環境下進行著深刻的轉型。那么,AI …

IP-Guard對SolidWorks PDM 加密授權說明

SolidWorks PDM 加密授權說明 一、簡介 該功能主要實現了,在SolidWorks Enterprise PDM環境下,可以正常"檢入"和"檢出" 加密文件,并可以正常預覽加密文件。 二、操作說明 2.1 設置加密授權 安裝客戶端后,登錄控制臺,選擇客戶端計算機或組右鍵選擇“…

AI 助力游戲開發中的常用算法實現

在當今的游戲開發領域,人工智能(AI)技術的應用已經成為推動行業發展的關鍵力量。AI不僅能夠提升游戲的智能化水平,還能夠增強玩家的沉浸感和游戲體驗。隨著技術的進步,AI在游戲設計、開發和測試中的應用越來越廣泛&…

重現ORA-01555 細說Oracle Undo 數據管理

1. 概述 1.1. Undo 數據應用 undo數據是: 原始的、修改之前的數據副本 是針對更改數據的每個事務處理所捕獲的 至少保留到事務處理結束 用于支持: 回退操作 讀取一致性查詢 閃回查詢、閃回事務處理和閃回表 從失敗的事務處理中進行恢復 1.2. 事…

Java 集合 Collection、List、Set

一. Collection 單列集合 1. Collection代表單列集合,每個元素(數據)只包含一個值 2. Collection集合特點 ① List系列集合:添加的元素是有序、可重復、有索引。 ArrayList、LinekdList:有序、可重復,有索引 ② Set系列集合&…

wamp php7.4 運行dm8

背景 1、電腦安裝了dm8,具體參照官網dm8安裝 2、安裝好了wamp,我當前的php版本切換成了7.4的,我wamp的安裝路徑d:\wamp64\ 操作 3、查看phpinfo,如果Thread Safet為enabled,則選擇pdo74_dm.dll,否則選擇…

pdf預覽兼容問題- chrome瀏覽器105及一下預覽不了

使用的"tato30/vue-pdf": "^1.11.2"預覽插件&#xff0c;發現chrome瀏覽器105及一下預覽不了 pdfPreview預覽組件&#xff1a; <template><div id"vue_pdf_view"><div class"tool_tip"><template v-if"pa…

linux 系統 mysql :8.4.3 主從復制 教程及運維命令

一、環境準備 硬件配置CPU2 核 CPU內存2 GB 內存硬盤30 GB 硬盤容量外網訪問服務器可以訪問外網軟件環境操作系統Anolis OS 7.9MySQL版本8.4.3 二、服務器清單 Master192.168.153.221Node192.168.153.222 三、安裝mysql &#xff08;兩臺機器都要下載&#xff09; # 下載 …

UE5材質節點Camera Vector/Reflection Vector

Camera Vector相機向量&#xff0c;輸出像素到相機的方向&#xff0c;結果歸一化 會隨著相機移動而改變 Reflection Vector 反射向量&#xff0c;物體表面法線反射到相機的方向&#xff0c;x和y和camera vector相反 配合hdr使用

復合機器人正以其高效、精準、靈活的特點,逐漸在汽車裝配線上嶄露頭角

隨著全球汽車制造業的快速發展&#xff0c;汽車裝配線已成為衡量企業生產效率和技術水平的重要標準。傳統的裝配方式往往依賴于大量的人工操作&#xff0c;這不僅效率低下&#xff0c;還面臨著質量不穩定、安全隱患等問題。然而&#xff0c;隨著智能科技的飛速進步&#xff0c;…

導致啟動nacos報錯Caused by: java.lang.IllegalStateException: No DataSource set 的兩種原因

Java資深小白&#xff0c;不足之處&#xff0c;或者有任何錯誤歡迎指出。 --藍紫報錯代碼如下: C:\Windows\System32>cd D:\nacos-server-2.2.3\nacos\binC:\Windows\System32>d:D:\nacos-server-2.2.3\nacos\bin>startup.cmd -m standalone "nacos is starting…

LinuxUbuntu打開VSCode白屏解決方案

解決方法是 以root權限打開VSCode sudo /usr/share/code/code --no-sandbox --unity-launch

C語言期末復習筆記(下)

目錄 九、指針 1.指針變量的定義和初始化 2.間接尋址符* 3.按值調用和按址調用 4.實例 5.函數指針 6.指針變量和其它類型變量的對比 十、字符串 1.字符串常量 2.字符串的存儲 3.字符指針 4.字符串的訪問和輸入/輸出 5.字符串處理函數 &#xff08;1&#xff09;str…

1、藍牙打印機環境搭建

本項目采用stm32f103c8T6芯片&#xff0c;通過庫函數實現打印功能&#xff0c;并配置有小程序藍牙通信上位機。 1、創建文件夾目錄 core文件夾存放核心庫文件 LIB文件夾存放標準庫函數文件 這里可以刪減&#xff0c;用不到的可以不要。 obj存放編譯后的文件 project存放項目…

IJCNN2025 投稿準備

投稿格式要求&#xff1a; IEEE - Manuscript Templates for Conference Proceedings 投稿網址&#xff1a; Conference Management Toolkit - Login