伟大意义:实现了三个模块组的解藕,可以使它们可以在客户端各自可以独立地变化,为客户端的调用提供了极大的方便
通过这种方式,被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变,控制的方式(DynamicSubject类)也可以动态改变,从而实现了非常灵活的动态代理关系
例如:4*9*3=108种组合
(接口模块组)第一个模块组:InterfaceAAA、InterfaceBBB、InterfaceCCC、InterfaceDDD 4个
(真实类模块组)第二个模块组:Real1、Real2、Real3、Real4、Real5、Real6、Real7、Real8、Real9 9个
(动态代理类之Handler模块组)第三个模块组:DynamicⅠ、DynamicⅡ、DynamicⅢ 3个
注意:假设Real1、Real2、Real3、Real4、Real5、Real6、Real7、Real8、Real9全部都实现了InterfaceAAA、InterfaceBBB、InterfaceCCC、InterfaceDDD。而DynamicⅠ、DynamicⅡ、DynamicⅢ全部都实现了接口InvocationHandler。
代码分析(接口类):(以Real5为例)
public interface Subject
{
abstract public void requestW(args);
abstract public void requestQ(args);
}
代码分析(动态代理类):(以DynamicⅡ为例)
public class DynamicⅡimplements InvocationHandler
{
private Object sub;
public DynamicSubject()
{
}
public DynamicSubject(Object obj)
{
sub = obj;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
preProcess(); 事先加上一些预处理 DynamicⅠ、DynamicⅡ、DynamicⅢ的区分之处(不同的处理方法)
System.out.println("before calling " + method);
method.invoke(sub, args);
System.out.println("after calling " + method);
postProcess() 事后加上一些后处理 事先加上一些预处理 DynamicⅠ、DynamicⅡ、DynamicⅢ的区分之处(不同的处理方法)
return null;
}
private void preProcess ()
{
// something you want to do before requesting
}
private void postProcess ()
{
// something you want to do after requesting
}
}
代码分析(客户端):(以InterfaceCCC 、Real5、DynamicⅡ组合为例)
public class Client
{
static public void main(String[] args) throws Throwable
{
Real5 rs = new Real5 (); // 在这里指定被代理类
InvocationHandler ds = new DynamicⅡ(rs);
Class<?> cls = rs.getClass();
// 以下是一次性生成代理
InterfaceCCC subject = (InterfaceCCC) Proxy.newProxyInstance(
cls.getClassLoader(), cls.getInterfaces(), ds);
subject.requestQ(args);接口Real5中声明的方法
subject.requestW(args);接口Real5中声明的方法
}
}
总结:struts中的拦截器(类似)实质就是DynamicⅠ、DynamicⅡ、DynamicⅢ
所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。