設計模式(11)---代理模式


一、題外話

  本節講一講代理模式,個人感覺代理模式非常簡單,使用起來幾乎沒有太大的困難,因此簡單講述即可。

   補充:剛開始學習代理模式時的感受確實和上面所說的一樣,但是經過一段時間的接觸,發現代理模式的原理是簡單,但如何深刻理解以及靈活運用可不是那么簡單。在本文的最后補充對代理模式新的理解。

 

二、定義

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

解釋:舉例來說,你想在美國買iphone6,但是你沒有到美國去,恰巧你有一朋友到美國出差,於是你讓朋友幫忙代買iphone6.整個過程就是代理模式,你是目標對象,你朋友作為代理,代你完成你想進行的操作。

 

三、UML類圖、基本代碼

基本代碼:

class Program
    {
        static void Main(string[] args)
        {
            Proxy proxy = new Proxy();
            proxy.Request();

            Console.Read();
        }
    }

    abstract class Subject
    {
        public abstract void Request();
    }

    class RealSubject : Subject
    {
        public override void Request()
        {
            Console.WriteLine("real request");
        }
    }

    class Proxy : Subject
    {
        RealSubject realSubject;
        public override void Request()
        {
            if (realSubject == null)
            {
                realSubject = new RealSubject();
            }

            realSubject.Request();
        }
    }

 

四、優缺點及適用場合:

優點:

1)代理模式能將代理對象與真正被調用的對象分離,在一定程度上降低了系統的耦合度。

2)代理模式在客戶端和目標對象之間起到一個中介作用,這樣可以起到保護目標對象的作用。代理對象也可以對目標對象調用之前進行其他操作。

 

缺點:

1)在客戶端和目標對象增加一個代理對象,會造成請求處理速度變慢。

2)增加了系統的復雜度。

 

使用場景:

1)遠程代理,也就是為一個對象在不同的地址空間提供局部代表。這樣可以隱藏一個對象存在於不同地址空間的事實。

2)虛擬代理,根據需要創建開銷很大的對象。通過它來存放實例化需要很長時間的對象。

3)安全代理,用來控制真實對象訪問時的權限。

4)智能指引,當調用目標對象時,代理可以處理其他的一些操作。

 

補充:

代理模式在菜鳥的世界里使用的頻率是不高(我是菜鳥,呵呵),但是只要是涉及到“服務”這塊,那你就必然會有所了解。

舉例說明:

  做一個平台,為了接入非常多的第三方系統,那平台必然需要提供接口。但問題來了,第三方系統調用平台的接口不一而足,那么如果做一個統一的webservice面向所有的第三方系統,實際上也是可以的,但是安全性必然不好。常用的做法是將平台的接口大致分為幾種,然后編寫幾個代理服務,它們分別提供不同的接口服務,並對不同的第三方廠家進行開放,這樣在保證整套系統正常運行的情況下還能在一定程度上提高其安全性。只是簡單補充代理模式的應用場景,其原理就不再細說了。

 

針對上文提到的讓出國的朋友代買手機,編寫一個小實例:

abstract class Purchase
    {
        public abstract void PurchaseMobile();
    }

    class RealPurchase : Purchase
    {
        public override void PurchaseMobile()
        {
            Console.WriteLine("張三買手機");
        }
    }

    class ProxyPurchase : Purchase
    {
        private RealPurchase realPurchase;

        public override void PurchaseMobile()
        {
            if (realPurchase == null) realPurchase = new RealPurchase();

            realPurchase.PurchaseMobile();
        }
    }

客戶端調用:

ProxyPurchase proxyPurchase = new ProxyPurchase();
proxyPurchase.PurchaseMobile();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM