白龍馬脖鈴兒急,顛簸唐玄奘小跑仨兄弟,西天取經不容易容易干不成大業績。還記得吳承恩的西游記伴隨著我走過了多少快樂的童年時光,當時年幼,殊不知,西游記中也蘊藏著設計模式,且聽我娓娓道來:
卻說那師徒二人,悟空牽著小白龍,與唐僧繼續趕路西行,雖說取經普度眾生刻不容緩,可是太陽公公要休息不是,于是太陽公公悄悄落入地平線,把余暉金燦燦的灑向大地。悟空見天色漸晚,騰空一看,不遠處有一村莊,問一人得知此村為高老莊,敲一門得知,這家主人為豬八戒的丈人高太公家。原來豬八戒要逼迫高太公把女兒翠蘭嫁給自己,為了將高家小姐解救出八戒的魔掌,悟空決定扮做高小姐,會一會這個妖怪:"行者卻弄神通,搖身一變,變得就如那女子一般,婀娜多姿,沉魚落雁,獨自個坐在房里等那妖精。不多時,一陣風來,真個是走石飛砂……那陣狂風過處,只見半空里來了一個妖精,果然生得丑陋:黑臉短毛,長喙大耳,穿一領青不青、藍不藍的梭布直裰,系一條花布手巾……走進房,一把摟住,就要親嘴……"上面的小故事,是我們大話設計中哪種模式呢?聰明的讀者肯定知道,就是我們設計模式中的代理模式,孫悟空變成高小姐的樣子代替高小姐婚配豬八戒,首先,我們來看一下代理模式的結構圖:
? ? ? ??
再回來我們的故事中,看看故事中的結構圖中是什么樣子的呢?

看看我們的這個故事用我們的代碼又是如何實現的呢?首先,我們來看看我的代理接口“娶媳婦”:
~~~
interface?IGetMarried??
{??
????void?Hug();??
????void?GetMarried();??
}??
~~~
豬八戒類如下:
~~~
class?Zhubajie:IGetMarried??
{??
????gaolaozhuang?miss?gao;??
????public?Zhubajie?(gaolaozhuang?miss?gao)??
????{??
????????this.Miss?gao=Miss?gao;??
????}??
????public?void?Hug()??
????{??
????????console.WriteLine("擁抱")??
????}??
????public?void?GetMarried()??
????{??
????????console.WriteLine("成親")??
????}??
}??
~~~
代理孫悟空類的代碼如下:
~~~
class?proxy:IGetMarried??
{??
????zhubajie?bajie;??
????public?proxy(Miss?gao)??
????{??
??????bajie=new?bajie(Miss?gao);??
????}??
????public?void?Hug()??
????{??
??????bajie.Hug();??
????}??
????public?void?GetMarried()??
????{??
????bajie.GetMarried();??
????}??
}??
~~~
客戶端代碼如下:
~~~
static?void?Main(string[]?args)??
????{??
????????gaolaozhuang?miss?gao?=new?Miss?gao();??
????????miss?gao.namespace="高小姐";??
???????proxy?daili?=new?proxy(miss?gao);??
????????daili.Hug();??
????????daili.GetMarried();??
????????Console.Read();??
????}??
~~~
代理模式英文名Proxy Pattern,是23種常用設計模式之一,她的功能是為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
代理貌似跟我們前面學習過的[委托](http://blog.csdn.net/u010850027/article/details/21376275)很容易混淆,淺談一下我對他們的認識,某個不想被外界訪問或者禁止直接被外界的對象,此時需要有一個中介使其能夠與外界進行通訊,而種中介就稱做代理。而C#中的委托(Delegate)有些不同,其本質是一種函數指針,其只是把對象委托給它的方法原封不動地提供給其他對象調用,并不能做任何的修飾。而代理并不是按照原接口提供出去,其做法是自身定義一個與被代理對象相同或者相似的接口提供給外界調用,因為提供的方法完全由代理本身的性質決定。設計之旅,未完待續......