天天看點

第 7 章 代理模式

定義:代理模式為其他對象提供一種代理以控制對這個對象的通路。

一般代理分為幾種:

1、遠端代理,也就是為一個對象在不同的位址空間提供局部代表,這樣可以隐藏一個對象存在于不同位址空間的事實。

比如WebService在.Net 中的調用

2、虛拟代理,是根據需要建立開銷很大的對象。通過它來存放執行個體化需要很長時間的真實對象。

這樣就可以達到性能的最大化,比如說你打開一個很大的HTML網頁時,裡面可能有很多的文字和圖檔,但你還是可以很快的打開它,此時你所看到的是所有的文字,但是圖檔确實一張一張的下載下傳後才能看到。那些未打開的圖檔框,就是通過虛拟代理來體代理真實的圖檔,此時代理存儲了真實的圖檔的路徑和尺寸。

3、安全代理,用來控制真實對象通路時的權限。

一般用于對象應該有不同的通路權限的時候。

4、智能指引,是指當調用真實對象時,代理處理另外一些事。

如計算真是對象的引用次數,這樣當該對象沒有引用時,可以自動釋放它,或當第一次引用一個持久對象時,将它裝入記憶體,或在通路一個實際對象前,檢查是否已經鎖定它,以確定其他對象不能改變它。它們都是通過代理在通路一個對象時附加一些内務處理。

/// <summary>
    /// 定義了RealSubject和Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy
    /// </summary>
    public abstract class Subject
    {
        public abstract void Request();
    }

    /// <summary>
    /// 定義了Proxy所代表的真實實體
    /// </summary>
    public class RealSubject : Subject
    {
        public override void Request()
        {
            Console.WriteLine("真實的請求");
        }
    }

    /// <summary>
    /// 儲存一個引用使得代理可以通路實體,并提供一個與Subject的接口相同的接口,這樣代理就可以用來替代實體。
    /// </summary>
    public class Proxy : Subject
    {
        RealSubject realSubject;
        public override void Request()
        {
            if (realSubject == null)
                realSubject = new RealSubject();
            realSubject.Request();
        }
    }      

用戶端代碼

Proxy p = new Proxy();
p.Request();
Console.ReadLine();      

結果