动态代理的意义

来源:互联网 发布:java soa框架 编辑:程序博客网 时间:2024/05/14 14:43

伟大意义:实现了三个模块组的解藕,可以使它们可以在客户端各自可以独立地变化,为客户端的调用提供了极大的方便

 

通过这种方式,被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变,控制的方式(DynamicSubject)也可以动态改变,从而实现了非常灵活的动态代理关系

 

例如:4*9*3=108种组合

 

接口模块组)第一个模块组:InterfaceAAAInterfaceBBBInterfaceCCCInterfaceDDD               4

 

 

真实类模块组)第二个模块组:Real1Real2Real3Real4Real5Real6Real7Real8Real9         9

 

 

动态代理类之Handler模块组)第三个模块组:DynamicDynamicDynamic                                   3

 

 

 

注意:假设Real1Real2Real3Real4Real5Real6Real7Real8Real9全部都实现了InterfaceAAAInterfaceBBBInterfaceCCCInterfaceDDD。而DynamicDynamicDynamicⅢ全部都实现了接口InvocationHandler

 

 

 

代码分析(接口类):(以Real5为例)

 

public interface Subject

{

    abstract public void requestW(args);

    abstract public void requestQ(args);

}

 

 

 

 

代码分析(动态代理类):(以Dynamic为例)

public class Dynamicimplements InvocationHandler

{

    private Object sub;

    public DynamicSubject()

    {

}

 

    public DynamicSubject(Object obj)

    {

        sub = obj;

    }

 

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable

{

     preProcess(); 事先加上一些预处理   DynamicDynamicDynamicⅢ的区分之处(不同的处理方法)

        System.out.println("before calling " + method);

 

        method.invoke(sub, args);

 

        System.out.println("after calling " + method);

postProcess()  事后加上一些后处理   事先加上一些预处理   DynamicDynamicDynamicⅢ的区分之处(不同的处理方法)

 

 

        return null;

    }

private void preProcess ()

    {

 

        // something you want to do before requesting

 

    }

 

    private void postProcess ()

    {

 

        // something you want to do after requesting

 

    }

}

 

代码分析(客户端):(以InterfaceCCC Real5Dynamic组合为例)

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中的拦截器(类似)实质就是DynamicDynamicDynamic

 

 

 

 

 

 

 

 

 

 

 

 

所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击