設計模式學習總結-代理模式(Proxy Method)

來源:互聯網
上載者:User

問題:
在某些情況下,一個對象不想或者不能直接引用另一個對象,而代理對象可以在用戶端和目標對象之間起到中介的作用。

•當由於某些特定的需要調用的對象在另外一台機器上,需要跨越網路才能訪問,在沒有WebService的情況下我們需要直接coding去處理網路連接、處理打包、解包等等非常複雜的步驟,而WebService的出現幫我們解決了其中的一些問題簡化用戶端的處理,我們只需在用戶端建立一個遠程對象的代理,用戶端就象調用本機物件一樣調用該代理,再由代理去跟實際對象聯絡,對於用戶端來說可能根本沒有感覺到調用的東西在網路另外一端。

定義:
對其他對象提供一種代理以控制對這個對象的訪問。

意圖:
提供一個Subject角色,它定義了Proxy與ConcreteSubject的功用介面,使得任何使用ConcreteSubject的地方都能使用Proxy,Proxy對象維護了一個對ConcreteSubject對象的引用,Proxy接受來至用戶端請求,通過這個引用,將請求轉給具體的ConcreteSubject對象,Proxy在執行具體對象操作時可以附加其他的操作。這樣通過增加代理來解耦用戶端與調用對象之間的調用,封裝了原來用戶端調用具體對象的一些相關細節,用戶端不在依賴具體的調用對象,具體對象的修改對用戶端來說是透明的,不會影響用戶端的修改。

參與者:
•抽象主題(Subject)角色:
聲明了代理主題和具體主題的公用介面,使任何需要具體主題的地方都能用代理主題代替。
•代理主題(Proxy)角色:
代理對象角色內部含有對具體對象的引用,從而可以操作具體對象,同時代理對象提供與具體對象相同的介面以便在任何時刻都能代替具體對象。同時,代理對象可以在執行具體對象操作時,附加其他的操作,相當於對具體對象進行封裝。
•具體具體對象(ConcreteSubject)角色:
代理角色所代表的具體對象,是我們最終要引用的對象。

UML:

執行個體代碼:

/// <summary>
/// 抽象主題(Subject)角色
/// </summary>
public interface ISubject
{
    void Request();
}
/// <summary>
/// 具體具體對象(ConcreteSubject)角色
/// </summary>
public class ConcreteSubject : ISubject
{
    public void Request()
    {
        System.Console.WriteLine("運行具體真實對象!");
    }
}
/// <summary>
/// 代理主題(Proxy)角色
/// </summary>
public class ProxySubject : ISubject
{
    /// <summary>
    /// 一個Subject的引用
    /// </summary>
    ISubject subject = new ConcreteSubject();
    public void Request()
    {
        System.Console.WriteLine("開始請求真實對象!");
        //通過引用請求ConcreteSubject
        subject.Request();
        System.Console.WriteLine("結束請求真實對象!");
    }
}
/// <summary>
/// 用戶端測試
/// </summary>
void ProxyTest()
{
    ProxySubject pr = ProxySubject();
    pr.Request();
}

分類適用場合:
•遠程代理,也就是為了一個對象在不同的地址空間提供局部代表,這樣可以隱藏一個對象存在於不同地址空間的事實,就像web service裡的代理類一樣。
•虛擬代理,根據需要建立開銷很大的對象,通過它來存放執行個體化需要很長時間的真實對象,比如瀏覽器的渲染的時候先顯示問題,而圖片可以慢慢顯示(就是通過虛擬代理代替了真實的圖片,此時虛擬代理儲存了真實圖片的路徑和尺寸。
•安全代理,用來控制真實對象訪問時的許可權,一般用於對象應該有不同的存取權限。
•智能指引,只當調用真實的對象時,代理處理另外一些事情。例如C#裡的記憶體回收,使用對象的時候會有引用次數,如果對象沒有引用了,GC就可以回收它了。

代理模式與面板模式的區別:
•面板模式也是屏蔽複雜性的,但是面板模式不會實現用戶端調用的目標類型介面。
•一般用戶端調用面板模式的方法都是直接調用。
•代理模式中對用戶端目標物件類型抽象介面具體化了。
•面板模式是代理模式中一種特殊的子級模式(廣泛的,非約束性)。
總結:
代理模式非常常用,大致的思想就是通過為對象加一個代理來降低對象的使用複雜度、或是提升對象使用的友好度、或是提高對象使用的效率。
GoF《設計模式》中說的:為其他對象提供一種代理以控制這個對象的訪問。理類型從某種角度上講也可以起到控制被代理類型的訪問的作用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.