C#設計模式(13)——代理模式(Proxy Pattern)

1、引言

在軟件開發過程當中,有些對象有時候會因爲網絡或其餘的障礙,以致於不可以或者不能直接訪問到這些對象,若是直接訪問對象給系統帶來沒必要要的複雜性,這時候能夠在客戶端和目標對象之間增長一層中間層,讓代理對象代替目標對象,而後客戶端只須要訪問代理對象,由代理對象去幫咱們去請求目標對象並返回結果給客戶端,這樣的一個解決思路就是今天要介紹的代理模式。c#

2、代理模式的詳細介紹

代理模式按照使用目的能夠分爲如下幾種:網絡

  • 遠程(Remote)代理:爲一個位於不一樣的地址空間的對象提供一個局域表明對象。這個不一樣的地址空間能夠是本電腦中,也能夠在另外一臺電腦中。最典型的例子就是——客戶端調用Web服務或WCF服務。併發

  • 虛擬(Virtual)代理:根據須要建立一個資源消耗較大的對象,使得對象只在須要時纔會被真正建立。ide

  • Copy-on-Write代理:虛擬代理的一種,把複製(或者叫克隆)拖延到只有在客戶端須要時,才真正採起行動。this

  • 保護(Protect or Access)代理:控制一個對象的訪問,能夠給不一樣的用戶提供不一樣級別的使用權限。spa

  • 防火牆(Firewall)代理:保護目標不讓惡意用戶接近。代理

  • 智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操做,好比將對此對象調用的次數記錄下來等。對象

  • Cache代理:爲某一個目標操做的結果提供臨時的存儲空間,以便多個客戶端能夠這些結果。接口

在哦上面全部種類的代理模式中,虛擬代理、遠程代理、智能引用代理和保護代理較爲常見的代理模式。下面讓咱們具體看看代理模式的具體定義。資源

2.1 定義

代理模式——就是給某一個對象提供一個代理,並由代理對象控制對原對象的引用。在一些狀況下,一個客戶不想或者不能直接引用一個對象,而代理對象能夠在客戶端和目標對象之間起到中介的做用。例如電腦桌面的快捷方式就是一個代理對象,快捷方式是它所引用的程序的一個代理

2.2 代理模式實現

看完代理模式的描述以後,下面以一個生活中的例子來解釋下代理模式,在現實生活中,若是有同事出國或者朋友出國的狀況下,咱們常常會拖這位朋友幫忙帶一些電子產品或化妝品等東西,這個場景中,出國的朋友就是一個代理,他(她)是他(她)朋友的一個代理,因爲他朋友不能去國外買東西,他卻能夠,因此朋友們都託他幫忙帶一些東西的。下面就以這個場景來實現下代理模式,具體代碼以下:

// 客戶端調用
    class Client
    {
        static void Main(string[] args)
        {
            // 建立一個代理對象併發出請求
            Person proxy = new Friend();
            proxy.BuyProduct();
            Console.Read();
        }
    }
    // 抽象主題角色
    public abstract class Person
    {
        public abstract void BuyProduct();
    }
    //真實主題角色
    public class RealBuyPerson : Person
    {
        public override void BuyProduct()
        {
            Console.WriteLine("幫我買一個IPhone和一臺蘋果電腦");
        }
    }
    // 代理角色
    public class Friend:Person
    {
        // 引用真實主題實例
        RealBuyPerson realSubject;
        public override void BuyProduct()
        {
            Console.WriteLine("經過代理類訪問真實實體對象的方法");
            if (realSubject == null)
            {
                realSubject = new RealBuyPerson();
            }
            this.PreBuyProduct();
            // 調用真實主題方法
            realSubject.BuyProduct();
            this.PostBuyProduct();
        }
        // 代理角色執行的一些操做
        public void PreBuyProduct()
        {
            // 可能不知一個朋友叫這位朋友帶東西,首先這位出國的朋友要對每一位朋友要帶的東西列一個清單等
            Console.WriteLine("我怕弄糊塗了,須要列一張清單,張三:要帶相機,李四:要帶Iphone...........");
        }
                         
        // 買完東西以後,代理角色須要針對每位朋友須要的對買來的東西進行分類
        public void PostBuyProduct()
        {
            Console.WriteLine("終於買完了,如今要對東西分一下,相機是張三的;Iphone是李四的..........");
        }
    }

在上面的代碼中都有相應的註釋,這裏也很少解釋了。

2.3 代理模式的類圖結構

看完代理模式的實現以後,下面就以上面的例子來分析下代理模式的類圖結構。具體的類圖以下所示:

27143323-c933932923ff4e47a43f57e0628fac5

在上面類圖中,代理模式所涉及的角色有三個:

抽象主題角色(Person):聲明瞭真實主題和代理主題的公共接口,這樣一來在使用真實主題的任何地方均可以使用代理主題。

代理主題角色(Friend):代理主題角色內部含有對真實主題的引用,從而能夠操做真實主題對象;代理主題角色負責在須要的時候建立真實主題對象;代理角色一般在將客戶端調用傳遞到真實主題以前或以後,都要執行一些其餘的操做,而不是單純地將調用傳遞給真實主題對象。例如這裏的PreBuyProduct和PostBuyProduct方法就是代理主題角色所執行的其餘操做。

真實主題角色(RealBuyPerson):定義了代理角色所表明的真是對象。

附:在實際開發過程當中,咱們在客戶端添加服務引用的時候,在客戶程序中會添加一些額外的類,在客戶端生成的類扮演着代理主題角色,咱們客戶端也是直接調用這些代理角色來訪問遠程服務提供的操做。這個是遠程代理的一個典型例子。

3、代理模式的優缺點

全面分析完代理模式以後,讓咱們看看這個模式的優缺點:

優勢:

  1. 代理模式可以將調用用於真正被調用的對象隔離,在必定程度上下降了系統的耦合度;

  2. 代理對象在客戶端和目標對象之間起到一箇中介的做用,這樣能夠起到對目標對象的保護。代理對象能夠在對目標對象發出請求以前進行一個額外的操做,例如權限檢查等。

缺點:

  1. 因爲在客戶端和真實主題之間增長了一個代理對象,因此會形成請求的處理速度變慢

  2. 實現代理類也須要額外的工做,從而增長了系統的實現複雜度。

5、總結

到這裏,代理模式的介紹就結束了,代理模式提供了對目標對象訪問的代理。而且到這裏,結構型模式的介紹也結束了,結構型模式包括:適配器模式、橋接模式、裝飾者模式、組合模式、外觀模式、享元模式和代理模式,下面開始介紹行爲型模式的第一個模式:模板方法模式。

相關文章
相關標籤/搜索