代理模式(Proxy),为其他对象提供一种代理以控制这个对象的访问。
结构图如下:
Subject 类,定义了RealSubject 和Proxy 的共用接口,这样就在任何使用RealSubject的地方都可以Proxy。
abstract class Subject
{
public abstract void Request();
}
RealSubject类,定义Proxy所代表的真实实体。
class RealSubject
{
public override void Request()
{
Console.WriteLine(“真实的请求”);
}
}
Proxy 类,保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。
class Proxy:Subject
{
RealSubject realSubject;
public override void Request()
{
if(realSubject == null)
{
realSubject = new RealSubject();
}
readsubject.Request();
}
}
客户端代码:
static void Main(string[] args)
{
Proxy proxy = new Proxy();
proxy.Request();
}
场景应用:
一。远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
二。虚拟代理,根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
三。安全代理,用来控制真实对象访问时的权限。
四。智能知音,当调用真实的对象时,代理处理另外一些事。
案例:
一位喜欢MM的追求者想要送礼物给MM,但是不想直接送出。可以用代理问题解决。
1.首先构建接口,让代理和追求者都实现这个接口。
interface IGiveGift
{
void GiveDolls(); // 送洋娃娃
void GiveFlowers(); // 送鲜花
void GiveChoolate(); // 送巧克力
}
MM实现代码:
class Girl
{
private string name;
public string Name
{
get{ return name;}
set{ name = value;}
}
}
追求者代码:
class Pursuit : IGiveGift
{
Girl mm;
public Pursuit(Girl mm)
{
this.mm = mm;
}
public void GiveDolls()
{
Console.WriteLine(mm.Name + " 送你的洋娃娃");
}
public void GiveFlowers()
{
Console.WriteLine(mm.Name + " 送你鲜花");
}
public void GiveChololate()
{
Console.WriteLine(mm.Name + " 送你的巧克力");
}
}
代理类:
class Proxy : IGiveGift
{
Pursuit gg;
public Proxy(Girl mm)
{
gg = new Pursuit(mm);
}
public void GiveDolls()
{
gg.GiveDolls();
}
public void GiveChololate()
{
gg.GiveChololate();
}
public void GiveFlowers()
{
gg.GiveFlowers();
}
}
客户端代码,MM不认识追求者,通过代理获得到礼物,实际是追求者送的礼物。
static void Main(string[] args)
{
Girl gg = new Girl();
gg.Name = "娇娇";
Proxy daili = new Proxy(gg);
daili.GiveDolls();
daili.GiveFlowers();
daili.GiveChololate();
Console.Read();
}
结果:
以上就我总结的代理模式。