代理要做的:控制和管理访问。
以远程代理为例,用Java自带的RMI实现。
1.先浏览和了解一下RMI吧
2.把本地需要被代理的类转换成远程服务,提供一些可以被远程调用的方法。
3.用RMI,创建一个能和远程对象沟通的代理。
代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问。使用代理模式创建代表(representative)对象,让代表对象控制某对象的访问,被代理的对象可以是远程对象(远程对象),创建开销大的对象(虚拟对象)或者是需要安全控制的对象(保护代理)。
类图表述:Subject为RealSubject和Proxy提供了接口,通过实现同一接口,Proxy在RealSubject出现的地方取代它。RealSubject是真正做事的对象,它是被proxy代理和控制访问的对象。Proxy持有RealSubject的引用。客户和RealSubject的交互都必须通过Proxy,因为Proxy和RealSubject实现相同的接口,所以任何用到RealSubject的地方,都可以用Proxy取代。Proxy也控制了对RealSubject的访问。
虚拟代理:(准备虚拟代理Virtual Proxy)控制访问实例化开销大的对象。
代理和装饰者的意图:
代理的意图在于作为真正主题的替身,保护对象避免不想要的访问,避免在加载大对象的过程中GUI会挂起,或者隐藏主题在远程运行的事实等。
装饰者:只能装饰点缀,从来不会实例化任何东西。
保护代理:
Java在java.lang.reflect包中有自己的代理支持,利用这个包你可以在运行时动态地创建一个代理类,实现一个或多个接口,并将方法的调用转发到你所指定的类。因为实际的代理类是在运行时创建的,我们称这个Java技术为动态代理。
创建Java API的动态代理:
1.创建两个InvocationHandler
InvovationHandler实现了代理的行为。Java负责创建真实代理类和对象,我们只需要提供在方法调用发生时知道做什么的handler。
2.写代码创建动态代理:
利用适当的代理包装主题对象。
动态代理之所以被称为动态,是因为运行时才将它的类创建出来。代码开始执行时,还没有proxy类,它是根据需要从你传入的接口集中创建的。
InvocationHandler根本就不是proxy,他只是一个帮助proxy的类,proxy会把调用方法转发给他处理。Proxy本身是利用静态的Proxy.newProxyInstance()方法在运行时动态地创建的。
Proxy.isProxyClass()此方法可以判断一个类是不是代理类。
写在最后:
代理模式有许多变体,例如:缓存代理、同步代理、防火墙代理和写入时复制代理。
Java内置的代理支持,可以根据需要动态建立代理,并将所有调用分配到所选的处理器Handler