歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C#設計模式-代理模式

C#設計模式-代理模式

日期:2017/3/1 9:07:55   编辑:Linux編程

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

一、 代理(Proxy)模式

代理模式按照使用目的可以分為以下幾種:

  • 遠程(Remote)代理:為一個位於不同的地址空間的對象提供一個局域代表對象。這個不同的地址空間可以是本電腦中,也可以在另一台電腦中。最典型的例子就是——客戶端調用Web服務或WCF服務。
  • 虛擬(Virtual)代理:根據需要創建一個資源消耗較大的對象,使得對象只在需要時才會被真正創建。
  • Copy-on-Write代理:虛擬代理的一種,把復制(或者叫克隆)拖延到只有在客戶端需要時,才真正采取行動。
  • 保護(Protect or Access)代理:控制一個對象的訪問,可以給不同的用戶提供不同級別的使用權限。
  • 防火牆(Firewall)代理:保護目標不讓惡意用戶接近。
  • 智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操作,比如將對此對象調用的次數記錄下來等。
  • Cache代理:為某一個目標操作的結果提供臨時的存儲空間,以便多個客戶端可以這些結果。

在上面所有種類的代理模式中,虛擬代理、遠程代理、智能引用代理和保護代理較為常見的代理模式。下面讓我們具體看看代理模式的具體定義:

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

二、 代理模式的類圖

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

  • 抽象主題角色(Person):聲明了真實主題和代理主題的公共接口,這樣一來在使用真實主題的任何地方都可以使用代理主題。
  • 代理主題角色(Friend):代理主題角色內部含有對真實主題的引用,從而可以操作真實主題對象;代理主題角色負責在需要的時候創建真實主題對象;代理角色通常在將客戶端調用傳遞到真實主題之前或之後,都要執行一些其他的操作,而不是單純地將調用傳遞給真實主題對象。例如這裡的PreBuyProduct和PostBuyProduct方法就是代理主題角色所執行的其他操作。
  • 真實主題角色(RealBuyPerson):定義了代理角色所代表的真是對象。

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

三、 代理模式的實現

下面以一個生活中的例子來解釋下代理模式,在現實生活中,如果有同事出國或者朋友出國的情況下,我們經常會拖這位朋友幫忙帶一些電子產品或化妝品等東西,這個場景中,出國的朋友就是一個代理,他(她)是他(她)朋友的一個代理,由於他朋友不能去國外買東西,他卻可以,所以朋友們都托他幫忙帶一些東西的。下面就以這個場景來實現下代理模式,具體代碼如下:

// 客戶端調用

using System;

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是李四的..........");
    }
}

在上面的代碼中都有相應的注釋,這裡也不多解釋了。

四、 代理模式的優缺點

優點:

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

缺點:

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

五、 總結

到這裡,代理模式的介紹就結束了,代理模式提供了對目標對象訪問的代理。

Copyright © Linux教程網 All Rights Reserved