【设计模式】学习笔记17:代理模式之保护代理与Java反射
本文出自 http://blog.csdn.net/shuangde800
本笔记内容:
1. Java动态代理,反射机制
2. 保护代理
3. 应用保护代理实现的约会系统
----------------------------------------
我们知道,相亲节目已经在天朝的电视上已经火了多年了,说明了有广大同胞需要这个配对服务,更别说咱们程序猿这个群体了。
现在要实现一个约会服务系统。你希望在这个服务系统中,增加一个评分功能,类似于豆瓣上的评分系统。
浏览一个人资料后,可以给对方进行评分。
你希望这套系统能帮助顾客找到一个理想的对象,这也会让事情更有趣。
很快,你应该就能想到服务系统需要一个PersonBean的接口,来设置或取得一个人的信息:
Invocation的工作原理是响应代理的任何调用,可以看成是代理收到方法调用后,请求做实际工作的对象。
我们要用Java的动态代理创建这个约会系统的保护代理。
下面来看怎样用Java动态代理实现保护模式。
实现保护代理的约会系统
顾客不可以改变自己的HotOrNot评分,也不可以改变其他顾客的个人信息。为了达到这个目标,必须要创建两个代理:一个用来访问你自己的PersonBean对象,另一个用来访问另一个顾客的PersonBean对象。这样,代理就可以控制在每一种情况下允许哪一种请求了。
创建这个代理,就必须使用Java API的动态代理。Java会为我们创建两个代理,而我们只需要提供handler来处理代理转来的方法。
步骤一:创建两个InvocationHandler
InvocationHandler实现了代理的行为,Java负责创建真实代理类和对象。我们只需要提供在方法调用发生时知道做什么的handler。我们需要写两个InvocationHandler(调用处理器),其中一个给拥有者使用,另一个给非拥有者使用。究竟什么是InvocationHandler呢?可以这样想:当代理方法被调用时,代理就会把这个调用转发给InvocationHandler,但是这并不是通过调用InvocationHandler的对应方法做到的。
给拥有者使用的InvocationHandler:
小结:
动态代理之所以称为动态代理,是因为运行时才将它的类创建出来。代码开始时,还没有proxy类, 它是根据需要从你传入的接口集创建的。
InvocationHandler不是一个proxy,它只是一个帮助proxy的类,proxy会把调用转发给它处理.Proxy本身是利用静态的Proxy.newProxyInstance()方法在运行时动态创建的。
代理模式一共记了三篇的笔记:远程代理,虚拟代理,和保护代理。代理模式的还远远不止这些:
防火墙代理(Firewall Proxy):
控制网络资源的访问,保护主题免于“坏客户”的侵害。常用在公司的防火墙系统
智能引用代理(Smart Reference Proxy):
当主题被引用时,进行额外的动作,例如计算一个对象被引用的次数。
缓存代理(Caching Proxy):
为开销大的运算结果提供暂时存储:它也可以允许多个客户共享结果,以减少计算或网络延迟。常用在Web服务器代理,以及内容管理与出版系统。
同步代理(Synchronizationi Proxy):
在多线程的情况下为主题提供安全的访问。常用在JavaSpaces,为分散式环境内的潜在对象集合提供同步访问控制。
复杂隐藏代理(Complexity Hiding Proxy):
用来隐藏一个类的复杂集合的复杂度,并进行访问控制。有时候也称为外观代理(Facade Proxy),这不难了解。复杂隐藏代理和外观模式是不一样的,因为代理控制访问,而外观模式只提供另一组接口.
写入时复制代理(Copy-On-Write Proxy):
用来控制对象的复制,方法是延迟对象的复制,知道客户真的需要为止。这是虚拟代理的变体。