首頁新聞博問專區閃存班級我的部落格我的園子賬号設定登出注冊登入
Tynam Yang 首頁新随筆聯系管理随筆 - 322 文章 - 6 評論 - 119 C#設計模式——代理模式(Proxy Pattern) 引言在我們的生活中,經常會遇到需要什麼東西,但是自己又不是很友善或者對方不是很友善,則就需要中間的一個代理人去解決。例如代購。
在軟體開發中,也會遇到這樣的問題。有些對象有時候會由于網絡或其他的障礙,以至于不能夠或者不能直接通路到這些對象,如果直接通路對象給系統帶來不必要的複雜性,這時候可以在用戶端和目标對象之間增加一層中間層,讓代理對象代替目标對象,然後用戶端隻需要通路代理對象,由代理對象去幫我們去請求目标對象并傳回結果給用戶端,這樣的一個解決思路就是今天要介紹的代理模式。概念代理是一種結構型設計模式, 讓你能提供真實服務對象的替代品給用戶端使用。 代理接收用戶端的請求并進行一些處理 (通路控制和緩存等), 然後再将請求傳遞給服務對象。
代理對象擁有和服務對象相同的接口, 這使得當其被傳遞給用戶端時可與真實對象互換。結構圖代理模式所涉及的角色有三個:抽象主題角色(Person):聲明了真實主題和代理主題的公共接口,這樣一來在使用真實主題的任何地方都可以使用代理主題。代理主題角色(Friend):代理主題角色内部含有對真實主題的引用,進而可以操作真實主題對象;代理主題角色負責在需要的時候建立真實主題對象;代理角色通常在将用戶端調用傳遞到真實主題之前或之後,都要執行一些其他的操作,而不是單純地将調用傳遞給真實主題對象。例如這裡的PreBuyProduct和PostBuyProduct方法就是代理主題角色所執行的其他操作。真實主題角色(RealBuyPerson):定義了代理角色所代表的真是對象。分類 代理模式按照使用目的可以分為以下幾種:遠端(Remote)代理:為一個位于不同的位址空間的對象提供一個局域代表對象。這個不同的位址空間可以是本電腦中,也可以在另一台電腦中。最典型的例子就是——用戶端調用Web服務或WCF服務。虛拟(Virtual)代理:根據需要建立一個資源消耗較大的對象,使得對象隻在需要時才會被真正建立。Copy-on-Write代理:虛拟代理的一種,把複制(或者叫克隆)拖延到隻有在用戶端需要時,才真正采取行動。保護(Protect or Access)代理:控制一個對象的通路,可以給不同的使用者提供不同級别的使用權限。防火牆(Firewall)代理:保護目标不讓惡意使用者接近。智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操作,比如将對此對象調用的次數記錄下來等。Cache代理:為某一個目标操作的結果提供臨時的存儲空間,以便多個用戶端可以這些結果。 在上面所有種類的代理模式中,虛拟代理、遠端代理、智能引用代理和保護代理較為常見的代理模式。實作例如項目A的PM需要購買一個測試工具,但是測試工具的營運商在國外,自己過去不是很友善,是以需要找一個代理商幫助自己去購買。下面就實作此購買的例子:using System;
namespace Proxy
{
class Program
{
static void Main(string[] args)
{
ProgramManagement PM = new ProgramManagement();
PM.BuyToolName = "Bug管理工具";
PM.BuyTestTool();
ProxyBuyTestTool Tynam = new ProxyBuyTestTool(PM);
Tynam.BuyTestTool();
Console.ReadKey();
}
}
public interface ITestTool
{
void BuyTestTool();
}
public class ProgramManagement : ITestTool
{
public string BuyToolName;
public void BuyTestTool()
{
Console.WriteLine($"項目A需要找一個代理商購買國外的一款{this.BuyToolName}的測試工具");
}
}
public class ProxyBuyTestTool : ITestTool
{
private ProgramManagement _pm;
public ProxyBuyTestTool(ProgramManagement pm)
{
this._pm = pm;
}
public void BuyTestTool()
{
Console.WriteLine($"幫助項目A購買測試工具{this._pm.BuyToolName}成功");
}
}
}運作後結果項目A需要找一個代理商購買國外的一款Bug管理工具的測試工具
幫助項目A購買測試工具Bug管理工具成功使用場景當無法或不想直接引用某個對象或通路某個對象存在困難時,可以通過代理對象來間接通路。使用代理模式主要有兩個目的:一是保護目标對象,二是增強目标對象。由于代理模式有許多分類,應用場景又适于多種情況:遠端代理,這種方式通常是為了隐藏目标對象存在于不同位址空間的事實,友善用戶端通路。例如,使用者申請某些網盤空間時,會在使用者的檔案系統中建立一個虛拟的硬碟,使用者通路虛拟硬碟時實際通路的是網盤空間。虛拟代理,這種方式通常用于要建立的目标對象開銷很大時。例如,下載下傳一幅很大的圖像需要很長時間,因某種計算比較複雜而短時間無法完成,這時可以先用小比例的虛拟代理替換真實的對象,消除使用者對伺服器慢的感覺。安全代理,這種方式通常用于控制不同種類客戶對真實對象的通路權限。智能指引,主要用于調用目标對象時,代理附加一些額外的處理功能。例如,增加計算真實對象的引用次數的功能,這樣當該對象沒有被引用時,就可以自動釋放它。延遲加載,指為了提高系統的性能,延遲對目标的加載。例如,Hibernate 中就存在屬性的延遲加載和關聯表的延時加載。優缺點優點:代理模式在用戶端與目标對象之間起到一個中介作用和保護目标對象的作用。代理對象可以擴充目标對象的功能。代理模式能将用戶端與目标對象分離,在一定程度上降低了系統的耦合度,增加了程式的可擴充性。缺點:代理模式會造成系統設計中類的數量增加。在用戶端和目标對象之間增加一個代理對象,會造成請求處理速度變慢。增加了系統的複雜度。 作者:Tynam.Yang
出處:https://www.cnblogs.com/tynam/
本文版權歸作者和部落格園共有,歡迎轉載但需在文章頁面明顯位置給出作者和原文連結,否則保留追究法律責任的權利。 分類: 設計模式好文要頂 關注我 收藏該文 Tynam.Yang
關注 - 22
粉絲 - 310 +加關注 00
« 上一篇: C#設計模式-原型模式(Prototype Pattern) posted @ 2020-11-23 10:20 Tynam.Yang 閱讀(61) 評論(0) 編輯 收藏
重新整理評論重新整理頁面傳回頂部
發表評論 【福利】注冊AWS賬号,立享12個月免費套餐 編輯預覽 7693b08a-a8f6-49f3-f45a-08d88556cc23 Markdown 幫助自動補全 不改了退出 訂閱評論 [Ctrl+Enter快捷鍵送出]
首頁 新聞 博問 專區 閃存 班級 【推薦】News: 大型組态、工控、仿真、CADGIS 50萬行VC++源碼免費下載下傳
【推薦】部落格園 & 陌上花開HIMMR 給單身的程式員小哥哥助力脫單啦~
【推薦】從零開始的RPG遊戲制作教程,來《魔獸争霸III》共同成長
【推薦】了不起的開發者,擋不住的華為,園子裡的品牌專區
【推薦】未知數的距離,毫秒間的傳遞,聲網與你實時互動
【福利】AWS攜手部落格園為開發者送免費套餐與抵扣券
【推薦】 阿裡雲折扣價格返場,錯過再等一年
相關博文:
· 正規表達式--(?:pattern)與(?=pattern)的差別
· ProxyReflect
· charles開啟Charles-Proxy-macOSProxy時報錯
· Fun論設計模式之2:代理模式(ProxyPattern)與華為雲API設計之一
· ES6知識點-Proxy和Reflect
» 更多推薦…最新 IT 新聞:
· 當你按下「随機播放」時,QQ音樂和網易雲們都做了什麼?
· 「菜鳥」索尼挑戰大疆,無人機行業來了新玩家
· 谷歌整合所有音樂服務,YouTube能否扛起大旗?
· vivo為什麼要重新做一個手機系統?
· 超大 AirPods、9 倍大紙牌、手機投影儀……這些産品不好用但很吸睛
» 更多新聞…
公告聯系我:[email protected] 昵稱: Tynam.Yang
園齡: 2年8個月
粉絲: 310
關注: 22 +加關注
搜尋 我的标簽appium(3) 設計模式(3) 性能測試(1) book(1) 積分與排名 積分 - 232850 排名 - 2535 随筆分類 (343) appium(9) app測試(7) C#(27) database(8) Django(4) docker(4) Html+CSS(18) JaveScript(14) Jenkins(4) JMeter(28) linux及shell(17) postman(3) python(35) python接口(7) python爬蟲(6) selenium(31) Tkinter(20) 安全測試(5) 測試基礎(21) 測試面試(12) 測試資料(4) 漫談測試(9) 模拟器&虛拟機(7) 其他(19) 設計模式(6) 書籍推薦(3) 資料分析(2) 網絡協定(6) 性能測試(1) 抓包工具(6) 文章分類 (6) 筆記後感(1) 漫談雜論(1) 詩詞賞析(3) 閑情趣事(1) 常用網站 chrome插件網 線上工具 花瓣網 GitHub stackoverflow 閱讀排行榜 1. python對Excel的讀取(100978) 2. BurpSuit2.0專業版破解(23158) 3. Visual Studio語言設定(19784) 4. 虛拟機-linux系統中圖形界面和指令行界面切換(9352) 5. C#-判斷語句(五)(8955) 推薦排行榜 1. python對Excel的讀取(55) 2. C#-特性(Attribute)(27) 3. C#-索引器(23) 4. C#設計模式-模闆方法模式(Template Method)(11) 5. Newman基本使用(11)
Copyright © 2020 Tynam.Yang
Powered by .NET 5.0.0 on Kubernetes