欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.Net結(jié)構(gòu)型設(shè)計模式之代理模式(Proxy)

 更新時間:2022年05月25日 16:46:30   作者:springsnow  
這篇文章介紹了.Net結(jié)構(gòu)型設(shè)計模式之代理模式(Proxy),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、動機(Motivate)

在面向?qū)ο笙到y(tǒng)中,有些對象由于某種原因(比如對象創(chuàng)建的開銷很大,或者某些操作需要安全控制,或者需要進(jìn)程外的訪問等),直接訪問會給使用者、或者系統(tǒng)結(jié)構(gòu)帶來很多麻煩。如何在不失去透明操作對象的同時來管理/控制這些對象特有的復(fù)雜性?增加一層間接層是軟件開發(fā)中常見的解決方式。

二、意圖(Intent)

為其他對象提供一種代理以控制對這個對象的訪問。                                 ——《設(shè)計模式》GoF

三、結(jié)構(gòu)圖(Structure)

四、模式的組成

代理模式所涉及的角色有三個:
(1)、抽象主題角色(Subject):聲明了真實主題和代理主題的公共接口,這樣一來在使用真實主題的任何地方都可以使用代理主題。
(2)、代理主題角色(Proxy):代理主題角色內(nèi)部含有對真實主題的引用,從而可以操作真實主題對象;代理主題角色負(fù)責(zé)在需要的時候創(chuàng)建真實主題對象;代理角色通常在將客戶端調(diào)用傳遞到真實主題之前或之后,都要執(zhí)行一些其他的操作,而不是單純地將調(diào)用傳遞給真實主題對象。
(3)、真實主題角色(RealSubject):定義了代理角色所代表的真實對象。
附:在WCF或者WebService的開發(fā)過程中,我們在客戶端添加服務(wù)引用的時候,在客戶程序中會添加一些額外的類,在客戶端生成的類扮演著代理主題角色,我們客戶端也是直接調(diào)用這些代理角色來訪問遠(yuǎn)程服務(wù)提供的操作。這個是遠(yuǎn)程代理的一個典型例子。

五、代理模式的分類:

代理模式按照使用目的可以分為以下幾種:
(1)、遠(yuǎn)程(Remote)代理:為一個位于不同的地址空間的對象提供一個局域代表對象。這個不同的地址空間可以是本電腦中,也可以在另一臺電腦中。最典型的例子就是——客戶端調(diào)用Web服務(wù)或WCF服務(wù)。
(2)、虛擬(Virtual)代理:根據(jù)需要創(chuàng)建一個資源消耗較大的對象,使得對象只在需要時才會被真正創(chuàng)建。
(3)、Copy-on-Write代理:虛擬代理的一種,把復(fù)制(或者叫克?。┩涎拥街挥性诳蛻舳诵枰獣r,才真正采取行動。
(4)、保護(hù)(Protect or Access)代理:控制一個對象的訪問,可以給不同的用戶提供不同級別的使用權(quán)限。
(5)、防火墻(Firewall)代理:保護(hù)目標(biāo)不讓惡意用戶接近。
(6)、智能引用(Smart Reference)代理:當(dāng)一個對象被引用時,提供一些額外的操作,比如將對此對象調(diào)用的次數(shù)記錄下來等。
(7)、Cache代理:為某一個目標(biāo)操作的結(jié)果提供臨時的存儲空間,以便多個客戶端可以這些結(jié)果。
在上面所有種類的代理模式中,虛擬代理、遠(yuǎn)程代理、智能引用代理和保護(hù)代理較為常見的代理模式。

六、代理模式的具體實現(xiàn)

說起“代理模式”,其實很容易,現(xiàn)實生活中的例子也很多。明星的經(jīng)紀(jì)人,國家的發(fā)言人都是代理的好例子。我們就用明星經(jīng)紀(jì)人這個事情來介紹“代理模式”的實現(xiàn)吧。

/// <summary>
/// 大明星都有錢,有錢了,就可以請自己的經(jīng)紀(jì)人了,有了經(jīng)紀(jì)人,很多事情就不用自己親力親為。弄點緋聞,炒作一下子通過經(jīng)紀(jì)人就可以名正言順的的操作了,萬一搞不好,自己也可以否認(rèn)。
/// </summary>
static void Main(string[] args)
{
    //近期,F(xiàn)an姓明星關(guān)注度有點下降,來點炒作
    AgentAbstract fan = new AgentPerson();
    fan.Speculation("偶爾出來現(xiàn)現(xiàn)身,為炒作造勢");

}


//該類型就是抽象Subject角色,定義代理角色和真實主體角色共有的接口方法
public abstract class AgentAbstract
{
    //該方法執(zhí)行具體的炒作---該方法相當(dāng)于抽象Subject的Request方法
    public virtual void Speculation(string thing)
    {
        Console.WriteLine(thing);
    }
}

//該類型是Fan姓明星,有錢有勢,想炒什么炒什么---相當(dāng)于具體的RealSubject角色
public sealed class FanStar : AgentAbstract
{
    //有錢有勢,有背景啊
    public FanStar() { }

    //要有名氣,定期要炒作---就是RealSubject類型的Request方法
    public override void Speculation(string thing)
    {
        Console.WriteLine(thing);
    }
}

//該類型是代理類型----相當(dāng)于具體的Proxy角色
public sealed class AgentPerson : AgentAbstract
{
    //這是背后的老板,
    private FanStar boss;

    //老板在后面發(fā)號施令
    public AgentPerson()
    {
        boss = new FanStar();
    }

    //炒作的方法,執(zhí)行具體的炒作---就是Proxy類型的Request方法
    public override void Speculation(string thing)
    {
        Console.WriteLine("前期弄點緋聞,拍點野照");
        boss.Speculation(thing);
        Console.WriteLine("然后開發(fā)布會,傷心哭泣,繼續(xù)撈錢");
    }
}

七、代理模式的實現(xiàn)要點:

“增加一層間接層”是軟件系統(tǒng)中對許多復(fù)雜問題的一種常見解決方法。在面向?qū)ο笙到y(tǒng)中,直接使用某些對象會來帶很多問題,作為間接層的Proxy對象便是解決這一問題的常用手段。具體Proxy設(shè)計模式的實現(xiàn)方法、實現(xiàn)粒度都相差很大,有些可能對單個對象做細(xì)粒度的控制,如copy-on-write技術(shù),有些可能對組件模塊提供抽象代理層,在架構(gòu)層次對對象做Proxy。
Proxy并不一定要求保持接口的一致性,只要能夠?qū)崿F(xiàn)間接控制,有時候損及一些透明性是可以接受的。

1、代理模式的優(yōu)點:

(1)、代理模式能夠?qū)⒄{(diào)用用于真正被調(diào)用的對象隔離,在一定程度上降低了系統(tǒng)的耦合度;
(2)、代理對象在客戶端和目標(biāo)對象之間起到一個中介的作用,這樣可以起到對目標(biāo)對象的保護(hù)。代理對象可以在對目標(biāo)對象發(fā)出請求之前進(jìn)行一個額外的操作,例如權(quán)限檢查等。
不同類型的代理模式也具有獨特的優(yōu)點,例如:

(1)、遠(yuǎn)程代理為位于兩個不同地址空間對象的訪問提供了一種實現(xiàn)機制,可以將一些消耗資源較多的對象和操作移至性能更好的計算機上,提高系統(tǒng)的整體運行效率。
(2)、虛擬代理通過一個消耗資源較少的對象來代表一個消耗資源較多的對象,可以在一定程度上節(jié)省系統(tǒng)的運行開銷。
(3)、緩沖代理為某一個操作的結(jié)果提供臨時的緩存存儲空間,以便在后續(xù)使用中能夠共享這些結(jié)果,優(yōu)化系統(tǒng)性能,縮短執(zhí)行時間。
(4)、保護(hù)代理可以控制對一個對象的訪問權(quán)限,為不同用戶提供不同級別的使用權(quán)限。

2、代理模式的缺點:

(1)、由于在客戶端和真實主題之間增加了一個代理對象,所以會造成請求的處理速度變慢
(2)、實現(xiàn)代理類也需要額外的工作,從而增加了系統(tǒng)的實現(xiàn)復(fù)雜度。

3、代理模式的使用場景:

代理模式的類型較多,不同類型的代理模式有不同的優(yōu)缺點,它們應(yīng)用于不同的場合:
(1)、 當(dāng)客戶端對象需要訪問遠(yuǎn)程主機中的對象時可以使用遠(yuǎn)程代理
(2)、當(dāng)需要用一個消耗資源較少的對象來代表一個消耗資源較多的對象,從而降低系統(tǒng)開銷、縮短運行時間時可以使用虛擬代理,例如一個對象需要很長時間才能完成加載時。
(3)、當(dāng)需要為某一個被頻繁訪問的操作結(jié)果提供一個臨時存儲空間,以供多個客戶端共享訪問這些結(jié)果時可以使用緩沖代理。通過使用緩沖代理,系統(tǒng)無須在客戶端每一次訪問時都重新執(zhí)行操作,只需直接從臨時緩沖區(qū)獲取操作結(jié)果即可。
(4)、 當(dāng)需要控制對一個對象的訪問,為不同用戶提供不同級別的訪問權(quán)限時可以使用保護(hù)代理。
(5)、當(dāng)需要為一個對象的訪問(引用)提供一些額外的操作時可以使用智能引用代理。

八、.NET 中代理模式的實現(xiàn)

代理模式在Net的FCL中的實現(xiàn)也不少,框架級別的有,類級別的也有??蚣芗墑e的有WCF,Remoting,他們都需要生成本地的代理,然后通過代理訪問進(jìn)程外或者機器外的對象。類級別的有StringBuilder類型,StringBuilder其實就是一種代理,我們本意是想訪問字符串的,StringBuilder就是一種可變字符串的代理,而且StringBuilder也沒有和String保持接口的一致性。

九、總結(jié)

到今天為止,我們設(shè)計模式的三個部分講完兩個部分了,第一個部分是“創(chuàng)建型”的設(shè)計模式,解決對象創(chuàng)建的問題,對對象創(chuàng)建的解耦。第二部分就是“結(jié)構(gòu)型”的設(shè)計模式,所謂結(jié)構(gòu)型設(shè)計模式模式,顧名思義討論的是類和對象的結(jié)構(gòu) ,主要用來處理類或?qū)ο蟮慕M合。它包括兩種類型,一是類結(jié)構(gòu)型模式,指的是采用繼承機制來組合接口或?qū)崿F(xiàn);二是對象結(jié)構(gòu)型模式,指的是通過組合對象的方式來實現(xiàn)新的功能。它包括適配器模式、橋接模式、裝飾者模式、組合模式、外觀模式、享元模式和代理模式。設(shè)計模式到現(xiàn)在也說了不少了,但是看起來很多模式都很類似,之間好像很容轉(zhuǎn)換,有時候條件不同了,的確模式也可以轉(zhuǎn)換,但是不能肆意的轉(zhuǎn)換。為了避免思想的混亂,我們把“結(jié)構(gòu)型”這個幾個設(shè)計模式,再總結(jié)一次,把握核心,理解使用場景。

  • 適配器模式注重轉(zhuǎn)換接口,將不吻合的接口適配對接
  • 橋接模式注重分離接口與其實現(xiàn),支持多維度變化
  • 組合模式注重統(tǒng)一接口,將“一對多”的關(guān)系轉(zhuǎn)化為“一對一”的關(guān)系
  • 裝飾者模式注重穩(wěn)定接口,在此前提下為對象擴展功能
  • 外觀模式注重簡化接口,簡化組件系統(tǒng)與外部客戶程序的依賴關(guān)系
  • 享元模式注重保留接口,在內(nèi)部使用共享技術(shù)對對象存儲進(jìn)行優(yōu)化
  • 代理模式注重假借接口,增加間接層來實現(xiàn)靈活控制

到此這篇關(guān)于.Net結(jié)構(gòu)型設(shè)計模式之代理模式(Proxy)的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ASP.NET Core應(yīng)用啟動Startup類簡介

    ASP.NET Core應(yīng)用啟動Startup類簡介

    這篇文章介紹了ASP.NET Core中的應(yīng)用啟動Startup類,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • .Net創(chuàng)建型設(shè)計模式之抽象工廠模式(Abstract?Factory)

    .Net創(chuàng)建型設(shè)計模式之抽象工廠模式(Abstract?Factory)

    這篇文章介紹了.Net設(shè)計模式之抽象工廠模式(Abstract?Factory),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • MSMQ微軟消息隊列詳解

    MSMQ微軟消息隊列詳解

    本文詳細(xì)講解了MSMQ微軟消息隊列,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • ABP基礎(chǔ)架構(gòu)深入探索

    ABP基礎(chǔ)架構(gòu)深入探索

    這篇文章主要介紹了ABP基礎(chǔ)架構(gòu)深入探索,為了了解應(yīng)用程序是如何配置和初始化,本文將探討ASP.NET?Core和ABP框架最基本的構(gòu)建模塊
    2022-05-05
  • WCF入門需要掌握的基礎(chǔ)知識

    WCF入門需要掌握的基礎(chǔ)知識

    這篇文章介紹了WCF入門需要掌握的基礎(chǔ)知識,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • .Net中Task Parallel Library的基本用法

    .Net中Task Parallel Library的基本用法

    這篇文章介紹了.Net中Task Parallel Library的基本用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • ASP.NET?Core命令行界面CLI用法

    ASP.NET?Core命令行界面CLI用法

    這篇文章介紹了ASP.NET?Core命令行界面CLI的用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • IIS部署ASP.NET?Core項目及常見問題總結(jié)

    IIS部署ASP.NET?Core項目及常見問題總結(jié)

    這篇文章介紹了IIS部署ASP.NET?Core項目的方法及常見問題總結(jié),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • ASP.Net Core MVC基礎(chǔ)系列之服務(wù)注冊和管道

    ASP.Net Core MVC基礎(chǔ)系列之服務(wù)注冊和管道

    這篇文章介紹了ASP.Net Core MVC中的服務(wù)注冊和管道,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • IE 性能分析工具(asp.net環(huán)境)

    IE 性能分析工具(asp.net環(huán)境)

    這個工具應(yīng)該很有用,因為用 IE 的人實在是太多了~~萬惡的IE6 !
    2010-08-08

最新評論