設計模式- 代理模式

定義

爲其他對象提供一種代理以控制對這個對象的訪問。

理解

代理模式也是經常在我們生活中會發生的和編程中經常會接觸到的事情。也許你沒意識到這就是代理模式,但我想你應該接觸過和使用過了。

1、比如你喜歡一個女孩子,你不敢直接表白,於是你找了一個朋友代你去表白,那個代你表白的朋友就相當於一個代理。

2、再從宏觀一點的角度看,我們的操作系統也是一個代理模式,它是基於硬件和軟件之間這麼一箇中間層、代理層。

3、如果你接觸過三層架構,那我想你一定知道哪三層,模型層(Model)、數據訪問層(DAL)、業務邏輯層(BLL)。其實業務邏輯層就是相當於一個代理層。

4、再比如生活中的這麼一個例子,在大學校園裏有些同學會做這麼一個兼職工作,關於手機充值卡的代理商。其實宏觀一點去思考,這也是代理模式的一種。 

經過上面幾點,代理模式其實也是有兩點值得去注意的。第一點是實,第二點是虛。好比如第一個例子,想表白的同學他是實的,而代爲表白的那個是虛的。三層架構也是一樣,實際幹活的數據訪問層是實的,而業務邏輯層一層間接層他是虛的。

代理的應用

代理的應用其實也很廣泛,以前我覺的三層裏的BLL層可以去掉,但是對代理模式多了一些瞭解後,BLL層也是挺重要的。

我們來看一下代理模式的應用

1、遠程代理:有使用過.NET裏面的WebService的朋友可能會這種體會。我們在項目中添加引用了WebService後會生成一個WebReference文件夾,通過訪問這個文件夾裏面的文件,去訪問實際上的方法。

2、緩存方面的代理:用戶A想要打開一個網頁,那麼在沒有代理層處理的情況下他是直接通過服務器打開網頁。那麼如果有一千個人在同一時間段那打開網頁那麼會給服務器造成很大的壓力。這時候我們通過建立一個代理層,在這一層代理層上通過緩存的方式,來減少服務器的壓力。

  3、安全代理:例如做一個登陸的時候,我們可以對用戶名、密碼、IP地址、使用驗證碼等……在代理層對這些進行訪問控制,實現訪問的安全性。

 

Proxy模式的幾個要點(在WEBCAST裏抄下來的

  •  “增加一層間接層是軟件系統中對許多複雜問題的一種常見解決方法。在面向對象系統中,直接使用某些對象會帶來很多問題,作爲間接層的proxy對象便是解決這一問題的常用手段。
  •  具體proxy設計模式的實現方法、實現粒度都相差很大,有些可能對單個對象做細粒度的控制,如copy-on-write技術,有些可能對組件模塊提供抽象代理層,在架構層次對對象做proxy
  • Proxy並不一定要求保持接口的一致性,只要能夠實現間接控制,有時候損及一些透明性是可以接受的。

   我是第一次聽到copy-on-write,其實那裏面講的我不是很理解,但還是想把半懂半懂這一點記在這裏:

  這兩句語句string A="Hello";   string B="Hello"; 雖然他們字符串都是相同的但是這種形式卻開闢了兩塊內存空間。這會造成內存浪費。爲了減少浪費,所以有了這種Copy-on-Write技術的提出。
  
例如StringBuilder就是一個典型的copy-on-write技術的使用:
  這兩句語句 StringBuilder A = new StringBuilder("Hello"); StringBuilder B = new StringBuilder("Heelo"); 他們能做到不造成內存浪費,原因是他們通過代理模式,由代理模式指向同一塊內存空間。在想改變他們內容的時候,通過代理,把指向的內存空間複製一份,然後重寫裏面的內容,如果內容沒有發生變化,就不改變。

 

UML

簡單的代碼實現例子

/// <summary>
/// 公共接口
/// </summary>
interface ISubject
{
    void Request();
}
/// <summary>
/// 被代理的類
/// </summary>
public class RealSubject : ISubject
{
    public void Request()
    {
        Console.WriteLine("被代理類的請求");
    }
}
/// <summary>
/// 代理類
/// </summary>
public class Proxy : ISubject
{
    RealSubject realSubject=new RealSubject();
    public void Request()
    {
        realSubject.Request();
    }
}
/// <summary>
/// 客戶代碼
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
    Proxy proxy = new Proxy();
    proxy.Request();
}

 

我的博客園原文地址:http://www.cnblogs.com/cxeye/archive/2012/08/30/2663346.html

發佈了40 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章