最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

二、意圖(Intent)

為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪(fǎng)問(wèn)。                                 ——《設(shè)計(jì)模式》GoF

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

四、模式的組成

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

五、代理模式的分類(lèi):

代理模式按照使用目的可以分為以下幾種:
(1)、遠(yuǎn)程(Remote)代理:為一個(gè)位于不同的地址空間的對(duì)象提供一個(gè)局域代表對(duì)象。這個(gè)不同的地址空間可以是本電腦中,也可以在另一臺(tái)電腦中。最典型的例子就是——客戶(hù)端調(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ù)制(或者叫克隆)拖延到只有在客戶(hù)端需要時(shí),才真正采取行動(dòng)。
(4)、保護(hù)(Protect or Access)代理:控制一個(gè)對(duì)象的訪(fǎng)問(wèn),可以給不同的用戶(hù)提供不同級(jí)別的使用權(quán)限。
(5)、防火墻(Firewall)代理:保護(hù)目標(biāo)不讓惡意用戶(hù)接近。
(6)、智能引用(Smart Reference)代理:當(dāng)一個(gè)對(duì)象被引用時(shí),提供一些額外的操作,比如將對(duì)此對(duì)象調(diào)用的次數(shù)記錄下來(lái)等。
(7)、Cache代理:為某一個(gè)目標(biāo)操作的結(jié)果提供臨時(shí)的存儲(chǔ)空間,以便多個(gè)客戶(hù)端可以這些結(jié)果。
在上面所有種類(lèi)的代理模式中,虛擬代理、遠(yuǎn)程代理、智能引用代理和保護(hù)代理較為常見(jiàn)的代理模式。

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

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

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

}


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

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

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

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

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

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

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

“增加一層間接層”是軟件系統(tǒng)中對(duì)許多復(fù)雜問(wèn)題的一種常見(jiàn)解決方法。在面向?qū)ο笙到y(tǒng)中,直接使用某些對(duì)象會(huì)來(lái)帶很多問(wèn)題,作為間接層的Proxy對(duì)象便是解決這一問(wèn)題的常用手段。具體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ì)象在客戶(hù)端和目標(biāo)對(duì)象之間起到一個(gè)中介的作用,這樣可以起到對(duì)目標(biāo)對(duì)象的保護(hù)。代理對(duì)象可以在對(duì)目標(biāo)對(duì)象發(fā)出請(qǐng)求之前進(jìn)行一個(gè)額外的操作,例如權(quán)限檢查等。
不同類(lèi)型的代理模式也具有獨(dú)特的優(yōu)點(diǎn),例如:

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

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

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

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

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

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

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

九、總結(jié)

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

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

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

相關(guān)文章

  • WPF使用ValidationRules對(duì)MVVM架構(gòu)數(shù)據(jù)驗(yàn)證

    WPF使用ValidationRules對(duì)MVVM架構(gòu)數(shù)據(jù)驗(yàn)證

    這篇文章介紹了WPF使用ValidationRules對(duì)MVVM架構(gòu)數(shù)據(jù)驗(yàn)證的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • .NET中開(kāi)源文檔操作組件DocX的介紹與使用

    .NET中開(kāi)源文檔操作組件DocX的介紹與使用

    在大家日常開(kāi)發(fā)中讀寫(xiě)Offic格式的文檔,大家多少都有用到,可能方法也很多,組件有很多。這里不去討論其他方法的優(yōu)劣,只是向大家介紹一款開(kāi)源的讀寫(xiě)word文檔的組件。讀寫(xiě)Excel有NPOI,讀寫(xiě)Word,那看看DocX吧。下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2016-12-12
  • 程序中常用的種代碼

    程序中常用的種代碼

    程序中常用的種代碼...
    2006-08-08
  • 部署ASP.NET?Core程序到Linux系統(tǒng)

    部署ASP.NET?Core程序到Linux系統(tǒng)

    這篇文章介紹了部署ASP.NET?Core程序到Linux系統(tǒng)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • .Net結(jié)構(gòu)型設(shè)計(jì)模式之組合模式(Composite)

    .Net結(jié)構(gòu)型設(shè)計(jì)模式之組合模式(Composite)

    這篇文章介紹了.Net結(jié)構(gòu)型設(shè)計(jì)模式之組合模式(Composite),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • .Net創(chuàng)建型設(shè)計(jì)模式之簡(jiǎn)單工廠(chǎng)模式(Simple?Factory)

    .Net創(chuàng)建型設(shè)計(jì)模式之簡(jiǎn)單工廠(chǎng)模式(Simple?Factory)

    這篇文章介紹了.Net設(shè)計(jì)模式之簡(jiǎn)單工廠(chǎng)模式(Simple?Factory),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • asp.net中的cookie使用介紹

    asp.net中的cookie使用介紹

    asp.net中的cookie使用介紹,這里腳本之家將一些asp.net中的cookie操作方法整理下,需要的朋友可以參考下
    2012-05-05
  • AjaxControlToolKit DropDownExtender(下拉擴(kuò)展控件)使用方法

    AjaxControlToolKit DropDownExtender(下拉擴(kuò)展控件)使用方法

    由于工作的需要,使用了這個(gè)控件 挺簡(jiǎn)單,使用這個(gè)擴(kuò)展控件能輕松的吧 Label 控件 TextBox控件擴(kuò)展成類(lèi)似DropDownList控件的功能。這樣使用既可以使用label控件或者textBox控件的一些屬性又能實(shí)現(xiàn)dropDownList的功能。
    2008-10-10
  • ASP.NET Table 表格控件的使用方法

    ASP.NET Table 表格控件的使用方法

    使用 Table 控件可以在 ASP.NET 網(wǎng)頁(yè)上創(chuàng)建服務(wù)器可編程的表格。如果要?jiǎng)?chuàng)建的是靜態(tài)表格(運(yùn)行時(shí)不會(huì)在其中添加或更改內(nèi)容的表格),則應(yīng)使用 HTML 表格,而不是 Table 控件。
    2016-04-04
  • ASP.NET Substitution 控件的使用方法

    ASP.NET Substitution 控件的使用方法

    Substitution 控件可用于采用緩存配置的 ASP.NET 網(wǎng)頁(yè)上。使用 Substitution 控件,可以在網(wǎng)頁(yè)上創(chuàng)建一些區(qū)域,這些區(qū)域可以動(dòng)態(tài)更新,然后集成到緩存的網(wǎng)頁(yè)中。
    2016-04-04

最新評(píng)論

涞源县| 克山县| 岳阳市| 金乡县| 林甸县| 西宁市| 永福县| 大方县| 石屏县| 潮州市| 合川市| 保靖县| 时尚| 大足县| 新巴尔虎左旗| 崇礼县| 仁布县| 龙江县| 禄劝| 那曲县| 徐水县| 西吉县| 安吉县| 达日县| 贵溪市| 南靖县| 宁河县| 长兴县| 景德镇市| 正安县| 伽师县| 馆陶县| 富川| 徐水县| 宜兰县| 泊头市| 沙湾县| 大理市| 兰考县| 垦利县| 上高县|