溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

.Net結(jié)構(gòu)型設(shè)計(jì)模式之代理模式怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2022-05-26 09:12:32 來源:億速云 閱讀:123 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了.Net結(jié)構(gòu)型設(shè)計(jì)模式之代理模式怎么實(shí)現(xiàn)的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇.Net結(jié)構(gòu)型設(shè)計(jì)模式之代理模式怎么實(shí)現(xiàn)文章都會(huì)有所收獲,下面我們一起來看看吧。

    一、動(dòng)機(jī)(Motivate)

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

    二、意圖(Intent)

    為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問。                             

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

    .Net結(jié)構(gòu)型設(shè)計(jì)模式之代理模式怎么實(shí)現(xiàn)

    四、模式的組成

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

    五、代理模式的分類:

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

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

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

    /// <summary>
    /// 大明星都有錢,有錢了,就可以請(qǐng)自己的經(jīng)紀(jì)人了,有了經(jīng)紀(jì)人,很多事情就不用自己親力親為。弄點(diǎn)緋聞,炒作一下子通過經(jīng)紀(jì)人就可以名正言順的的操作了,萬(wàn)一搞不好,自己也可以否認(rèn)。
    /// </summary>
    static void Main(string[] args)
    {
        //近期,F(xiàn)an姓明星關(guān)注度有點(diǎn)下降,來點(diǎn)炒作
        AgentAbstract fan = new AgentPerson();
        fan.Speculation("偶爾出來現(xiàn)現(xiàn)身,為炒作造勢(shì)");
    
    }
    
    
    //該類型就是抽象Subject角色,定義代理角色和真實(shí)主體角色共有的接口方法
    public abstract class AgentAbstract
    {
        //該方法執(zhí)行具體的炒作---該方法相當(dāng)于抽象Subject的Request方法
        public virtual void Speculation(string thing)
        {
            Console.WriteLine(thing);
        }
    }
    
    //該類型是Fan姓明星,有錢有勢(shì),想炒什么炒什么---相當(dāng)于具體的RealSubject角色
    public sealed class FanStar : AgentAbstract
    {
        //有錢有勢(shì),有背景啊
        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ā)號(hào)施令
        public AgentPerson()
        {
            boss = new FanStar();
        }
    
        //炒作的方法,執(zhí)行具體的炒作---就是Proxy類型的Request方法
        public override void Speculation(string thing)
        {
            Console.WriteLine("前期弄點(diǎn)緋聞,拍點(diǎn)野照");
            boss.Speculation(thing);
            Console.WriteLine("然后開發(fā)布會(huì),傷心哭泣,繼續(xù)撈錢");
        }
    }

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

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

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

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

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

    2、代理模式的缺點(diǎn):

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

    3、代理模式的使用場(chǎng)景:

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

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

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

    關(guān)于“.Net結(jié)構(gòu)型設(shè)計(jì)模式之代理模式怎么實(shí)現(xiàn)”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“.Net結(jié)構(gòu)型設(shè)計(jì)模式之代理模式怎么實(shí)現(xiàn)”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI