《Head First Design Patterns》-第十一章
在RMI中,客户端的帮助类称为stub,服务器端的帮助类称为skeleton。
RMI:
第一步:构建远程接口。服务接口需要继承Remote接口,并声明其中所有的方法抛出RemoteException,确认所有的参数和返回值都是可序列化的。
第二步:构建远程实现。实现远程接口的类需要扩展UnicastRemoteObject,添加声明了RemoteException的无参数构造方法,把服务注册到RMI registry中,使用Naming.rebind。
第三步:生成stubs和skeletons。对远程实现类使用rmic。
第四步:运行rmiregistry。
第五步:启动服务。运行远程实现类。
客户端运行Naming.lookup,RMI registry返回stub对象,RMI自动反序列化该对象,因此你在客户端需要stub类,客户端调用stub的方法,就好像stub是实际的服务一样。
客户端需要的类是stub和远程接口类;服务端需要远程接口类,远程实现类,生成的stub和skeleton。
The Proxy Pattern provides a surrogate or placeholder for another object to control access to it.
虚拟代理是作为创建代价昂贵的对象的表示。虚拟代理通常直到真正需要才会创建对象,一旦创建出来,它把所有的请求代理给实际的对象。
代理模式变种的共同之处在于拦截客户端对subject的方法调用。
JDK的动态代理
第一步:构建Invocation Handlers。InvocationHandler只有一个方法invoke。
第二步:构建Proxy类并实例化Proxy对象。使用Proxy.newProxyInstance来创建代理。
可以使用Proxy.isProxyClass()来判断一个类是否是动态代理类。Proxy.newProxyInstance()只能接受接口数组,而不是类。所有的非公共接口需要来自同一个包,不能有包含冲突方法的接口。从JDK1.2开始就不需要skeleton了。在JDK 5中,stub也不需要了,可以使用动态代理来动态生成。