設計模式(九):代理模式

K戰神發表於2016-01-12

一、定義

代理模式就是中間層。可以幫助我們增加或者減少對目標類的訪問。

二、例項

我在專案中會遇見這樣的情況,類A中的方法是protected,但是此時另外一個分繼承自A類的B類要使用A中的個別方法。

比如這樣:

 public class Collect
    {
        protected void GetJson(string url)
        {
            Console.WriteLine("獲取Json.");
        }        
    }

    public class Context
    {
        public void GetHtmlFromUrl(string url)
        {
            //這裡想用 Collect中的GetJson()方法
        }
    }

好吧,那就增加一層代理,讓代理去搞定:

 public class Collect
    {
        protected void GetJson(string url)
        {
            Console.WriteLine("獲取Json.");
        }
    }

    public class JsonProxy : Collect
    {       
        public void GetJsonFromUrl(string url)
        {
            base.GetJson(url);
        }
    }

    public class Context
    {
        private JsonProxy jp = new JsonProxy();
        public void GetJson(string url)
        {
            jp.GetJsonFromUrl(url);
        }
    }

客戶端:

Proxy.Context cx = new Proxy.Context();
cx.GetJson("URL");
Console.ReadKey();

正規一點的代理模式:這裡我私自加了單例模式在裡面

public interface JsonProxy
    {
       void GetJsonFromUrl(string url);
    }
   
    public class Collect:JsonProxy
    {
        protected void GetJson(string url)
        {
            Console.WriteLine("執行受保護方法GetJson(),獲取Json.");
        }

        public void GetJsonFromUrl(string url)
        {
            this.GetJson(url);
        }
    }

    public class Proxy : JsonProxy
    {
        private static Collect collect { get; set; }      
        public static Proxy Instance { get; set; }
        private Proxy() { }
        static Proxy()
        {
            Instance = new Proxy();
            collect = new Collect();
            Console.WriteLine("單例 : 代理.");
        }      
        public void GetJsonFromUrl(string url)
        {
            collect.GetJsonFromUrl(url);
        }
    } 

客戶端:

//-----------------------代理模式---------------------
System.Threading.Tasks.Parallel.For(0, 500, t => { Proxy.Proxy.Instance.GetJsonFromUrl("URL"); });
Console.ReadKey();

 三、優缺點

優:

  1. 代理模式能夠將呼叫用於真正被呼叫的物件隔離,在一定程度上降低了系統的耦合度;
  2. 代理物件在客戶端和目標物件之間起到一箇中介的作用,這樣可以起到對目標物件的保護。代理物件可以在對目標物件發出請求之前進行一個額外的操作,例如許可權檢查等。

缺:

  1.  由於在客戶端和真實主題之間增加了一個代理物件,所以會造成請求的處理速度變慢
  2. 實現代理類也需要額外的工作,從而增加了系統的實現複雜度。

相關文章