介绍
代理模式:(Proxy)为其他对象提供一种代理以控制对这个对象的访问,一种对象结构型模式。Proxy结构图
Subject:抽象主题角色
Proxy:代理主题角色
RealSubject:真是主题角色
举例:
时间:五年前一天下午放学 地点:娇娇所在的中学高二年级 人物:娇娇、戴励、卓贾易
“娇娇同学,这是有人送你的礼物。”一个男生手里拿着一个芭比娃娃送到她面前。
戴励同学,这是什么意思?“娇娇望着同学同班的这个男生,感觉很奇怪。
”是这样的,我的好朋友,隔壁三班的卓贾易同学,请我代他送你这个礼物的。“戴励有些脸红。
”为什么送我礼物,我不认识他呀。“
”他说...他说...他说想和你交个朋友。“戴励脸更红了,右手抓后脑勺,说话吞吞吐吐。
”不用这样,我不需要礼物的。“娇娇显然想拒绝
”别别别,他是我最好的朋友,他请我代他送礼物给你,也是下了很大的决心的,你看在我之前时常帮你辅导数学习题的面子上,就接受一下吧。“戴励有些着急。
”那好吧,今天我对解析几何的椭圆哪里还是不是太懂,你在给我讲讲。“娇娇提出条件后接过礼物。
”没问题,我们到教室去讲吧。“戴励松了口气。
......
几天后
”娇娇,这是卓贾易送你的花。“
......
”娇娇,这是卓贾易送你的巧克力“
”我不要他送的礼物,我也不想和他做朋友。我愿意....我愿意和你做朋友!“娇娇终于忍不住了,直接表白。
代理接口代码
interface IGiveGift
{
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}
追求者代码
class Pursuit : IGiveGift
{
SchoolGril mm;
public Pursuit(SchoolGril mm)
{
this.mm = mm;
}
public void GiveDolls()
{
Console.WriteLine(mm.Name+ "送你洋娃娃");
}
public void GiveFlowers()
{
Console.WriteLine(mm.Name + "送你鲜花");
}
public void GiveChocolate()
{
Console.WriteLine(mm.Name + "送你巧克力");
}
}
代理类代码
class Proxy : IGiveGift
{
Pursuit gg;
public Proxy(SchoolGril mm)
{
gg = new Pursuit(mm);
}
public void GiveDolls()
{
gg.GiveChocolate();
}
public void GiveFlowers()
{
gg.GiveChocolate();
}
public void GiveChocolate()
{
gg.GiveChocolate();
}
}
客户端代码
static void Main(string[] args)
{
SchoolGril jiaojiao = new SchoolGril();
jiaojiao.Name = "李娇娇";
Proxy daili = new Proxy(jiaojiao);
daili.GiveDolls();
daili.GiveFlowers();
daili.GiveChocolate();
Console.Read();
}
娇娇不认识追求者(卓贾易)但是能却能够收到追求者的礼物,这样就达到了代理模式的效果。
代理模式的优点:
1、代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度2、远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求
3、虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度
4、保护代理可以控制对真实对象的使用权限。
缺点
1、由于在客户端和真实主题之间增加了代理对象,因此 有些类型的代理模式可能会造成请求处理速度变慢。2、实现代理模式需要额外的工作,有些代理的实现非常复杂。
分类
1)远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
2)虚拟代理,根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的对象。
3)安全代理,用来控制真实对象访问时的权限。
4)智能指引,当调用目标对象时,代理可以处理其他的一些操作。