白龙马脖铃儿急,颠簸唐玄奘小跑仨兄弟,西天取经不容易容易干不成大业绩。还记得吴承恩的西游记伴随着我走过了多少快乐的童年时光,当时年幼,殊不知,西游记中也蕴藏着设计模式,且听我娓娓道来:
却说那师徒二人,悟空牵着小白龙,与唐僧继续赶路西行,虽说取经普度众生刻不容缓,可是太阳公公要休息不是,于是太阳公公悄悄落入地平线,把余晖金灿灿的洒向大地。悟空见天色渐晚,腾空一看,不远处有一村庄,问一人得知此村为高老庄,敲一门得知,这家主人为猪八戒的丈人高太公家。原来猪八戒要逼迫高太公把女儿翠兰嫁给自己,为了将高家小姐解救出八戒的魔掌,悟空决定扮做高小姐,会一会这个妖怪:"行者却弄神通,摇身一变,变得就如那女子一般,婀娜多姿,沉鱼落雁,独自个坐在房里等那妖精。不多时,一阵风来,真个是走石飞砂……那阵狂风过处,只见半空里来了一个妖精,果然生得丑陋:黑脸短毛,长喙大耳,穿一领青不青、蓝不蓝的梭布直裰,系一条花布手巾……走进房,一把搂住,就要亲嘴……"上面的小故事,是我们大话设计中哪种模式呢?聪明的读者肯定知道,就是我们设计模式中的代理模式,孙悟空变成高小姐的样子代替高小姐婚配猪八戒,首先,我们来看一下代理模式的结构图:
![](https://box.kancloud.cn/2015-12-30_568374355d5e5.jpg)
再回来我们的故事中,看看故事中的结构图中是什么样子的呢?
![](https://box.kancloud.cn/2015-12-30_568374356e710.jpg)
看看我们的这个故事用我们的代码又是如何实现的呢?首先,我们来看看我的代理接口“娶媳妇”:
~~~
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)有些不同,其本质是一种函数指针,其只是把对象委托给它的方法原封不动地提供给其他对象调用,并不能做任何的修饰。而代理并不是按照原接口提供出去,其做法是自身定义一个与被代理对象相同或者相似的接口提供给外界调用,因为提供的方法完全由代理本身的性质决定。设计之旅,未完待续......