设计模式-代理模式(Proxy)
简介:
为其他对象提供一种代理以控制对这个对象的访问。(在访问真实对象时,引入一定程度的间接性,因为这种间接性可以附加多种用途)【结构型模式】
结构图:
优点:
- 高扩展性;
- 代理作为调用者和真实对象的中间层,降低了模块间的耦合性。
缺点:
- 由于在客户端和真实对象之间增加了代理对象,因此有些类型的代理模式可能会造成请求处理的速度变慢;
- 实现代理模式需要增加额外的代码,有些代码模式的实现可能很复杂。
应用场景:
- 远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏这个对象存在于不同地址空间的事实;
- 安全代理:用来控制真实对象访问时的权限;
- 虚拟代理:在创建一些占用大量内存或处理复杂的对象时,虚拟代理把这些对象推迟到真正使用它们时创建。对象被应用在第一次引用时创建,并同一个实例被重复使用;
- 智能指引:当调用真实对象时,代理可以做一些其他的逻辑。
注意事项:
- 和装饰模式的区别:装饰模式为了增强功能,代理模式为了加以控制;
- 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,代理模式不能改变所代理类的接口。
示例:
1.结构类图的实现:
ISubject类,定义了RealSubject和Proxy的公用接口。在任何使用RealSubject的地方都可以使用Proxy。
RealSubject类,定义Proxy所代表的真实实体。
Proxy类,保存一个引用使得代理可以访问实体,并提供一个与ISubject的接口相同的接口,这样代理就可以用来代替实体。
/// <summary> /// 主题 /// </summary> public interface ISubject { void Request(); } /// <summary> /// 真实主题 /// </summary> public class RealSubject : ISubject { public void Request() { Console.WriteLine("真实的请求"); } } /// <summary> /// 代理类 /// </summary> public class Proxy : ISubject { RealSubject real; public void Request() { if (real == null) real = new RealSubject(); real.Request(); } }
客户端
Proxy proxy = new Proxy(); proxy.Request();
结果
2.代理模式之撩妹
撩妹的最高境界就是,不用自己亲自出马,找个代理人送花,送巧克力就行。撩妹就是【Subject】,追求者就是【RealSubject】,代理人就是【Proxy】了。
美女和撩妹技巧
/// <summary> /// 美女 /// </summary> public class Beauty { public string Name; public Beauty(string name) { Name = name; } } /// <summary> /// 撩妹技巧 /// </summary> public interface IChaseGirl { /// <summary> /// 送花 /// </summary> void GiveFlowers(); /// <summary> /// 送巧克力 /// </summary> void GiveChocolate(); }
追求者和代理人
/// <summary> /// 追求者 /// </summary> public class Pursuit : IChaseGirl { private Beauty mm; public Pursuit(Beauty mm) { this.mm = mm; } public void GiveChocolate() { Console.WriteLine("送给{0}的巧克力~", mm.Name); } public void GiveFlowers() { Console.WriteLine("送给{0}的花~", mm.Name); } } /// <summary> /// 代理者 /// </summary> public class Proxy: IChaseGirl { /// <summary> /// 真实追求者 /// </summary> private Pursuit pursuit; public Proxy(Beauty mm) { pursuit = new Pursuit(mm); } public void GiveChocolate() { pursuit.GiveChocolate(); } public void GiveFlowers() { pursuit.GiveFlowers(); } }
客户端
Beauty mm = new Beauty("紫霞仙子"); Proxy proxy = new Proxy(mm); proxy.GiveChocolate(); proxy.GiveFlowers();
结果
话说紫霞仙子最后爱上了谁呢?追求者还是代理者?当然代理者啦,东西虽然真实的送出者是追求者,但整个过程中他的面都没有露过啊。
撩妹都要用代理模式,这难道就是程序猿单身的原因?
请多多指教~