1.初识代理模式html
生活中你们必定遇到这样的状况了:好比说我要买一条毛巾,不妨就是洁丽雅的吧,那通常人的话我应该不是去洁丽雅的工厂里面直接去买吧,而是咱们在洁丽雅专卖店或者什么超市啊,这些地方购买,这些地方实际上就是洁丽雅毛巾的代理。这其实和咱们OO中的代理模式是很类似的。网络
一个it人士,上网应该是常常的事了吧,那么总会有这样的状况,打开一个网页,文字先出现,而那些比较大的资源,例如图片要等等才会显示出来,这是为何呢??实际上这其中采用的就是代理模式。测试
2.代理模式的一个简单的例子spa
就说上面的毛巾的例子吧,将有以下类图:3d
消费者虽然买的是洁丽雅工厂生产的毛巾,确实经过洁丽雅专卖店买到的毛巾,并非直接去厂家拿货,这就是代理模式。看看代码吧:代理
//定义了接口 interface SaleTowelIntertace { void sellTowel(); } //毛巾的生产类 class TowelProduce : SaleTowelIntertace { string ConsumerName; TowelProduce(string consumer_name) { ConsumerName = consumer_name; } void sellTowel() { Console.WriteLine("毛巾卖给了{0}",ConsumerName); } } //卖毛巾的代理类 class TowelSaleProxy : SaleTowelIntertace { TowelProduce tp; TowelSaleProxy(string consumner_name) { tp = new TowelProduce(consumer_name); } void sellTowel() { tp.sellTowel(); } }
看了这段代码,可能会想,那么这个代理有什么用呢?彷佛看不到具体有什么好处啊!!其实这样的主要好处是真正购买毛巾的客户和厂家并不存在联系,即减少了他们之间的耦合性。这样说彷佛仍是有点抽象了,而这又是一个关键的问题。因此……code
3.代理模式的意义htm
代理模式到底好处在哪里呢??对象
那先要说一下代理模式中的三种角色了。blog
抽象角色:声明真实对象和代理对象的共同接口。
代理角色:代理对象角色内部含有对真实对象的引用,从而能够操做真实对象,同时代理对象提供与真实对象相同的接口以便在任什么时候刻都能代替真实对象。同时,代理对象 能够在执行真实对象操做时,附加其余的操做,至关于对真实对象进行封装。
真实角色:代理角色所表明的真实对象,是咱们最终要引用的对象。
代理模式的一个好处就是对外部提供统一的接口方法,而代理类在接口中实现对真实类的附加操做行为,从而能够在不影响外部调用状况下,进行系统扩展。也就是说,我要修改真实角色的操做的时候,尽可能不要修改他,而是在外部在“包”一层进行附加行为,即代理类。例如:接口A有一个接口方法operator(),真实角色:RealA实现接口A,则必须实现接口方法operator()。客户端Client调用接口A的接方法operator()。如今新需求来了,须要修改RealA中的operator()的操做行为。怎么办呢?若是修改RealA就会影响原有系统的稳定性,还要从新测试。这是就须要代理类实现附加行为操做。建立代理ProxyA实现接口A,并将真实对象RealA注入进来。ProxyA实现接口方法operator(),另外还能够增长附加行为,而后调用真实对象的operator()。从而达到了“对修改关闭,对扩展开放”,保证了系统的稳定性。咱们看客户端Client调用还是接口A的接口方法operator(),只不过实例变为了ProxyA类了而已。也就是说代理模式实现了ocp原则。
4.何时使用代理模式
当咱们须要使用的对象很复杂或者须要很长时间去构造,这时就可使用代理模式(Proxy)。例如:若是构建一个对象很耗费时间和计算机资源,代理模式(Proxy)容许咱们控制这种状况,直到咱们须要使用实际的对象。一个代理(Proxy)一般包含和将要使用的对象一样的方法,一旦开始使用这个对象,这些方法将经过代理(Proxy)传递给实际的对象。 一些可使用代理模式(Proxy)的状况:
一个对象,好比一幅很大的图像,须要载入的时间很长。
一个须要很长时间才能够完成的计算结果,而且须要在它计算过程当中显示中间结果
一个存在于远程计算机上的对象,须要经过网络载入这个远程对象则须要很长时间,特别是在网络传输高峰期。
一个对象只有有限的访问权限,代理模式(Proxy)能够验证用户的权限
代理模式(Proxy)也能够被用来区别一个对象实例的请求和实际的访问,例如:在程序初始化过程当中可能创建多个对象,但并不都是立刻使用,代理模式(Proxy)能够载入须要的真正的对象。这是一个须要载入和显示一幅很大的图像的程序,当程序启动时,就必须肯定要显示的图像,可是实际的图像只能在彻底载入后才能够显示!这时咱们就可使用代理模式(Proxy)。
原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/04/2576865.html