设计模式利剑6-代理模式

时间:2022-06-23 23:46:17

定    义:为其他对象提供一种代理以控制对这个对象的访问

优    点:

            1、职责清晰,真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是

                编程简洁清晰

             2、高扩展性,在主题角色发生了变化,代理类完全可以在不做任何修改情况下使用

             3、智能化,动态代理

使用场景:我印象最为深刻的为李开复在深圳的签书会,当时有几个北京大学的学生高举条幅,邀请李开复老师到北京大学演讲,当时李开复老师回答说这个要找我的助理先预约,应该是属于强制代理,北京大学的学生本来想绕过代理,结果还是要先找助理预约才能成功。其他正日常生活中,代理的例子也很多,例如打官司,要律师来代理打,一因为自己没有这么专业,另外自己也没那么多时间,所以代理给被人,减轻自己的负担。再例如我们上某些国外网站,使用代理方式来*,都是代理的运用。而我们常用的WebServices的引用,也是一种代理模式

理    解:Proxy模式则是为了避免一些复杂性但又在不失透明性的情况下引进中间层的一种解决手法

应用案例:

             先来看看代理模式的通用类图,其中RealSubject是实际的执行者,但是由于Client与RealSubject沟通复杂或者困难等原因,所以通过Proxy来处理与Client的事情,其实际执行者仍然是RealSubject.

设计模式利剑6-代理模式              再来看看我在深圳参加李开复老师的签书会所看到一个场景,北京大学学生集体邀请李开复老师去北京大学演讲,李开复老师让他们先找助理预约。于是便有了如下的UML图:

设计模式利剑6-代理模式            为了节约自己时间以及更好的安排,第三方机构直接与李开复老师沟通演讲会是有困难的,其中有很多的不确定因素,所以这个时候聪明的李开复老师引进了助理类,让助理类负责处理与第三方机构的演讲活动。也许举这种例子,站在大家的角度看,李开复老师高姿态,为什么不直接答应或者否定呢?那我在来看另外一个代理模式,一定能够理解代理的作用,如果你不用代理,你根本无法上FaceBook,因为我们有墙。出现了问题,很复杂,所以引入中间机构,解决问题,这就是代理。

设计模式利剑6-代理模式             再来看看我们经常在客户端调用一个Math函数,由于这个Math函数在服务器,所以本地客户调用Math函数特别的复杂,还要连接因特网到达服务器才行。

设计模式利剑6-代理模式

             那么有没有更加简单的方法让我们的客户端更加简单呢?有,那就是引入代理类,让代理来处理网络连接,提供一样的Math类的方法给客户端,这样完全可以屏蔽掉因特网这个障碍。

设计模式利剑6-代理模式

             设计的类图如下:

设计模式利剑6-代理模式

          代理模式可以进行如下扩展:

1、普通代理:我们要知道代理的存在,才能访问,它的要求是客户端只能访问代理角色,而不能访问展示角色,这是比较简单的。

设计模式利剑6-代理模式

2、强制代理:与一般的代理相反,你必须通过真实角色查找到代理角色,否则你不能访问,只有通过真实角色指定的代理类才能访问,也就是说代理角色由真实角色管理,好比有些名人,为了阻止自己名誉受到侵害,避免第三方代理机构欺骗消费者,所以必须要客户先找她确认代理,然后再通过代理来访问。

设计模式利剑6-代理模式 3、代理是有个性的,代理类不仅仅可以实现主题接口,也可以实现其他接口以完成不同的任务,如果代理需要收费,那么要实现收费的接口

设计模式利剑6-代理模式 4、虚拟代理,在需要的时候才初始化主体对象,可以避免被代理对象校对而引起的初始化缓慢的问题,这个需要用代码显示如下:

    pulic class proxy implements    Subject

         private _subject as Subject

        public Sub Request()

               if _subject  is null

                    _subject =new RealSubject()

               _subject .Request()

        end Sub

   end Class

5、动态代理,动态代理是在实现阶段不关心代理谁,而在运行阶段才指定代理那一个对象,动态代理是根据被代理的接口生成所有的方法,也就是说给定一个接口,动态代理会宣称我已经实现该接口下的所有方法了。这个东西暂时还无法理解,先放在这里,研究完Spring.NET再来看这个动态代理的原理和应用。

设计模式利剑6-代理模式

      先来看一看一个代理的代码:

 

设计模式利剑6-代理模式