設計模式之代理模式(Proxy)

1.初識代理模式html

  生活中你們必定遇到這樣的狀況了:好比說我要買一條毛巾,不妨就是潔麗雅的吧,那通常人的話我應該不是去潔麗雅的工廠裏面直接去買吧,而是咱們在潔麗雅專賣店或者什麼超市啊,這些地方購買,這些地方實際上就是潔麗雅毛巾的代理。這其實和咱們OO中的代理模式是很類似的。網絡

  一個it人士,上網應該是常常的事了吧,那麼總會有這樣的狀況,打開一個網頁,文字先出現,而那些比較大的資源,例如圖片要等等纔會顯示出來,這是爲何呢??實際上這其中採用的就是代理模式。測試

2.代理模式的一個簡單的例子spa

就說上面的毛巾的例子吧,將有以下類圖:3d

clipboard.png

消費者雖然買的是潔麗雅工廠生產的毛巾,確實經過潔麗雅專賣店買到的毛巾,並非直接去廠家拿貨,這就是代理模式。看看代碼吧:代理

//定義了接口
interface SaleTowelIntertace
{
    void sellTowel();
}
//毛巾的生產類
class TowelProduce : SaleTowelIntertace
{
    string ConsumerName;
    TowelProduce(string consumer_name)
    {
        ConsumerName = consumer_name;
    }
    void sellTowel()
    {
        Console.WriteLine("毛巾賣給了{0}",ConsumerName);
    }
}
//賣毛巾的代理類
class TowelSaleProxy : SaleTowelIntertace
{
    TowelProduce tp; 
    TowelSaleProxy(string consumner_name)
    {
        tp = new TowelProduce(consumer_name);
    }
    void sellTowel()
    {
        tp.sellTowel();
    }
}

看了這段代碼,可能會想,那麼這個代理有什麼用呢?彷佛看不到具體有什麼好處啊!!其實這樣的主要好處是真正購買毛巾的客戶和廠家並不存在聯繫,即減少了他們之間的耦合性。這樣說彷佛仍是有點抽象了,而這又是一個關鍵的問題。因此……code

3.代理模式的意義htm

  代理模式到底好處在哪裏呢??對象

  那先要說一下代理模式中的三種角色了。blog

  抽象角色:聲明真實對象和代理對象的共同接口。
  代理角色:代理對象角色內部含有對真實對象的引用,從而能夠操做真實對象,同時代理對象提供與真實對象相同的接口以便在任什麼時候刻都能代替真實對象。同時,代理對象        能夠在執行真實對象操做時,附加其餘的操做,至關於對真實對象進行封裝。
  真實角色:代理角色所表明的真實對象,是咱們最終要引用的對象。

  代理模式的一個好處就是對外部提供統一的接口方法,而代理類在接口中實現對真實類的附加操做行爲,從而能夠在不影響外部調用狀況下,進行系統擴展。也就是說,我要修改真實角色的操做的時候,儘可能不要修改他,而是在外部在「包」一層進行附加行爲,即代理類。例如:接口A有一個接口方法operator(),真實角色:RealA實現接口A,則必須實現接口方法operator()。客戶端Client調用接口A的接方法operator()。如今新需求來了,須要修改RealA中的operator()的操做行爲。怎麼辦呢?若是修改RealA就會影響原有系統的穩定性,還要從新測試。這是就須要代理類實現附加行爲操做。建立代理ProxyA實現接口A,並將真實對象RealA注入進來。ProxyA實現接口方法operator(),另外還能夠增長附加行爲,而後調用真實對象的operator()。從而達到了「對修改關閉,對擴展開放」,保證了系統的穩定性。咱們看客戶端Client調用還是接口A的接口方法operator(),只不過實例變爲了ProxyA類了而已。也就是說代理模式實現了ocp原則。

4.何時使用代理模式

  當咱們須要使用的對象很複雜或者須要很長時間去構造,這時就可使用代理模式(Proxy)。例如:若是構建一個對象很耗費時間和計算機資源,代理模式(Proxy)容許咱們控制這種狀況,直到咱們須要使用實際的對象。一個代理(Proxy)一般包含和將要使用的對象一樣的方法,一旦開始使用這個對象,這些方法將經過代理(Proxy)傳遞給實際的對象。 一些可使用代理模式(Proxy)的狀況:

  一個對象,好比一幅很大的圖像,須要載入的時間很長。    

  一個須要很長時間才能夠完成的計算結果,而且須要在它計算過程當中顯示中間結果

  一個存在於遠程計算機上的對象,須要經過網絡載入這個遠程對象則須要很長時間,特別是在網絡傳輸高峯期。

  一個對象只有有限的訪問權限,代理模式(Proxy)能夠驗證用戶的權限

  代理模式(Proxy)也能夠被用來區別一個對象實例的請求和實際的訪問,例如:在程序初始化過程當中可能創建多個對象,但並不都是立刻使用,代理模式(Proxy)能夠載入須要的真正的對象。這是一個須要載入和顯示一幅很大的圖像的程序,當程序啓動時,就必須肯定要顯示的圖像,可是實際的圖像只能在徹底載入後才能夠顯示!這時咱們就可使用代理模式(Proxy)。

原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/04/2576865.html

相關文章
相關標籤/搜索