1. 程式人生 > >【設計模式】代理模式

【設計模式】代理模式

pre ole 解決 font clas real 利用 模式 data

目錄

代理模式(Proxy)

代理模式是一種結構型設計模式,它可以為其他對象提供一種代理以控制對這個對象的訪問。

就是說代理類與被代理的類具有相同的接口, 然後客戶端必須通過代理類來與被代理的類進行交互. 而代理一般在交互的前後進行某些特定的處理.

技術分享圖片

proxy模式的類型

remote proxy

技術分享圖片

一般去handel client對於遠程service的調用. 適用於被代理的subject為web service, 或者是web api. 然後client通過proxy訪問這些遠程service. 在我的項目經驗中, Odata就符合remote proxy.

virtual proxy

這種代理模式比較靈活, client在構造代理的實例時傳遞的不是代理類的實例, 而是初始化代理類的實例的參數.

    //Client code
    VirtualProxy subject = new VirtualProxy("XiaoMing");
    subject.Visit();

    /// <summary>
    /// proxy code
    /// 通過參數來實例化一個subject,而不是直接將subject通過參數傳遞.
    /// </summary>
    public class VirtualProxy : ISubject
    {
        private string name;
        private ISubject subject;
        public VirtualProxy() { }

        public VirtualProxy(string name)
        {
            this.name = name;
        }
        
        public void Visit()
        {
            subject = new RealSubject(this.name);
            subject.Visit();
        }
    }

    //real subject
    public class RealSubject : ISubject
    {
        private string name = "";

        public RealSubject() { }

        /// <summary>
        /// for virtual proxy mode
        /// </summary>
        /// <param name="name"></param>
        public RealSubject(string name)
        {
            this.name = name;
        }

        public void Visit()
        {
            Console.WriteLine(name);
        }
    }

protection proxy

一般是保護real subject的訪問者必須是經過授權的. 比如下面的代碼demo中, 沒有授權的client的訪問時不被允許的.

技術分享圖片

靜態代理 和 動態代理

靜態代理有其比較明顯的缺點就是代理類必須實現被代理的類的接口裏面的所有方法.
如果被代理的類很多, 也就是說代理類需要繼承很多接口, 進而導致代理類特別臃腫,靈活性降低.

代理模式的幾種使用技巧

  • 利用代理進行緩存數據

    代理類中添加一個靜態緩存, 可以做到緩存數據的解決方案
  • 利用代理進行延遲加載

    同樣是對於代理模式裏面, 對於real subject的實例化延遲進行初始化.可以防止資源消耗
  • 利用代理實現單例

    這個一般使用靜態的real subject

  • 利用代理實現權限校驗

【設計模式】代理模式