浅谈代理模式

                                                                        设计模式----浅谈代理模式

------- android培训java培训、期待与您交流! ----------

 最近在研究设计模式,看到代理模式时心有所感,写出自己所得大家一起分享

代理模式(Proxy Pattern)的定义为:Provide a surrogate or placeholder for another object to control access to it. (为其他对象提供一种代理以控制对这个对象的访问);

代理模式也叫委托模式,是一种基本设计技巧,许多其他的模式在本质上的都采用了委托模式,代理模式一般可分为三个基本角色类型,Subject抽象主题角色(可以是抽象类或接口),RealSubject具体主题角色(也叫被委托角色,是业务逻辑的具体执行者),Proxy代理主题角色(也叫委托角色,他负责把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕后做预处理和善后处理),下面我们来看一个简单的类图:

 

看了这么多想必大家也基本知道了什么是代理模式,就像玩游戏时游戏里的代练,女生购物时所找的代购,还有去法院找律师,这都是代理,可以减轻你的负担,下面我们就用一个简单的代购案列来用代码呈现出代理模式:

 

这样就是一个简单的代理模式,在该模式下,调用者只知代理而不用知道真实的角色是谁,屏蔽了真实角色的变更对高层模块的影响,真实主题角色随意改变,对高层次的模块没有任何影响。

代理模式分为普通代理和强制代理,以上我们看到的就是普通代理,那么下面我们来看一下强制代理模式。

首先在IShopping接口里添加一个返回值为IShopping的GetProxy()方法,  然后修改Shoppinp和ShoppingProxy里面的代码:

 

这样就形成了一个强制代理模式,那么下面我们直接访问他的真实角色:

 

他要求你必须通过代理来访问他,想要直接访问实施不行的,那我们现在创建一个代理:

 

还是不能访问,因为他不是真实角色指定的对象,就像你要找一个明星,那么你必须要去找他指定的代理人,随便找一个代理人是不行的,要去找他指定的代理:

 

这样就可以正常访问了,强制代理的概念就是要从真实角色查找到代理角色,不允许直接访问真实角色,高层模块只调用GetProxy就可以直接访问真实角色的所有方法,他不需要产生一个代理类出来,代理的管理已经由真实角色自己完成,就像在现实中找代购要自己找一样。

通过上面的案例,我们可以总结出代理模式的一些优点与缺点。

优点:

  1. 代理模式能协调调用者和被调用者,在一定程度上降低了系统的耦合度。
  2. 虚拟代理通过一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
  3. 保护代理可以控制对真实对象的使用权限。

缺点:

  1.  由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
  2. 实现代理模式需要额外的工作,有些代理模式实现非常复杂。

总的来说,代理模式应用的非常广泛,大到一个系统框架,企业平台,小到代码片段,事务处理,都会使用到代理模式,可能是以后用到最多的模式,而且有类似于Spring AOP和AspectJ这样的工具,我们可以很简单的实现代理模式,代理模式之中还有一个重头叫做动态代理,在后续的博客中会继续分享。

  希望大家多多提自己的看法与意见,一起学习进步。

 

posted @ 2015-04-24 09:48  繁复  阅读(453)  评论(1编辑  收藏  举报