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

1、題外話web

  本節講一講代理模式,我的感受代理模式很是簡單,使用起來幾乎沒有太大的困難,所以簡單講述便可。安全

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

 

2、定義ide

代理模式:爲其餘對象提供一種代理以控制對這個對象的訪問。學習

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

 

3、UML類圖、基本代碼3d

基本代碼:代理

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();
        }
    }

 

4、優缺點及適用場合:code

優勢:對象

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();
相關文章
相關標籤/搜索