代理模式
代理模式为其他对象提供一种代理以控制对这个对象访问。
代理模式结构演示
实体抽象类:Subject
定义了RealSubject和Proxy的共用接口,这样就能在任何使用RealSubject的地方使用Proxy
abstract class Subject{ public abstract void Request(); }
真实实体类:RealSubject
定义Proxy所代表的真实实体。
class RealSubject : Subject{ public override void Request(){ Console.WriteLine("真实的请求"); } }
代理类:Proxy类
保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来代替实体。
class Proxy : Subject{ RealSubject realSubject; public override void Request(){ if (realSubject == null) realSubject = new RealSubject(); realSubject.Request(); } }
测试类:Program
Proxy proxy = new Proxy(); proxy.Request(); Console.Read();
测试结果:控制台
真实的请求
代理模式的应用
远程代理
也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
虚拟代理
是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,这样就可以达到性能的最优化。
安全代理
控制真实对象访问时的权限。一般用于对象应该有不同访问权限的时候。
智能指引
当调用真实的对象时,代理处理另外一些事,如计算真实对象的引用次数,当该对象没有引用时自动释放他。
更多例子:送礼物
代理接口:GiveGift
interface GiveGift{ void GiveDolls(); void GiveFlowers(); void GiveChocolate(); }
被追求者类:SchoolGirl
class SchoolGirl{ public string Name { get; set; } }
追求者类:Pursuit
class Pursuit : GiveGift{ SchoolGirl mm; public Pursuit(SchoolGirl mm) => this.mm = mm; public void GiveChocolate() => Console.WriteLine(mm.Name + ",送你巧克力"); public void GiveDolls() => Console.WriteLine(mm.Name + ",送你洋娃娃"); public void GiveFlowers() => Console.WriteLine(mm.Name + ",送你鲜花"); }
代理类:Proxy
class Proxy : GiveGift{ Pursuit gg; public Proxy(SchoolGirl mm) => gg = new Pursuit(mm); public void GiveChocolate() => gg.GiveChocolate(); public void GiveDolls() => gg.GiveDolls(); public void GiveFlowers() => gg.GiveFlowers(); }
测试类:Program
SchoolGirl sg = new SchoolGirl(); sg.Name = "小红"; Proxy proxy = new Proxy(sg); proxy.GiveFlowers(); proxy.GiveDolls(); proxy.GiveChocolate();
测试结果:控制台
小红,送你鲜花
小红,送你洋娃娃
小红,送你巧克力