代理模式
摘自《大话设计模式》(程杰 著)
代理模式: 为其他对象提供一种代理以控制对这个对象的访问。

应用
- 远程代理
为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理
根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。这样就可以达到性能最优化。
比如打开很大的HTML网页,可以用虚拟代理来代替真实图片,此时代理存储了真实的图片路径和尺寸。
- 安全代理
用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。
- 智能指引
当调用真实的对象时,代理处理另外一些事情。
如计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放。
或当第一次引用或持久对象时,将它装入内存。
或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它。
代码
Subject.cs
abstract class Subject
{
public abstract void Request();
}
RealSubject.cs
class RealSubject: Subject
{
public override void Request()
{
Console.WriteLine("真实的请求");
}
}
Proxy.cs
class Proxy : Subject
{
RealSubject realSubject;
public override void Request()
{
if (realSubject == null)
{
realSubject = new RealSubject();
}
realSubject.Request();
}
}
Program.cs 客户端
Proxy proxy = new Proxy();
proxy.Request();
Console.Read();
实例

代理接口 GiveGift.cs
interface GiveGift
{
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}
追求者类 Pursuit.cs
class Pursuit: GiveGift
{
SchoolGirl mm;
public Pursuit(SchoolGirl 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 + "送你巧克力");
}
}
代理类 Proxy.cs
class Proxy: GiveGift
{
Pursuit gg;
public Proxy(SchoolGirl mm)
{
gg = new Pursuit(mm);
}
public void GiveDolls()
{
gg.GiveDolls();
}
public void GiveFlowers()
{
gg.GiveFlowers();
}
public void GiveChocolate()
{
gg.GiveChocolate();
}
}
客户端 Program.cs
SchoolGirl jiaojiao = new SchoolGirl();
jiaojiao.Name = "李娇娇";
Proxy daili = new Proxy(jiaojiao);
daili.GiveDolls();
daili.GiveFlowers();
daili.GiveChocolate();
Console.Read();
浙公网安备 33010602011771号