Java设计模式之JDK动态代理模式

先来谈谈什么动态代理模式,在一家软件公司,假如你是一个软件开发工程师。当客户带着需求去找公司的时候,显然不会直接让你和客户谈,肯定是先和商务经理,产品经理类的谈需求。因为客户的需求可能千奇百怪,很有可能直接在商务谈的时候就直接终止合作,所以这个时候根本需要你去参与,当需求对接完毕可以投入开发的时候在由产品经理和你对接根据需求去开发。这个时候才相当与客户和你间接的合作。
在这个例子中产品经理类的角色就是代理对象,而你就是真实的对象。这就是一个动态代理模式,这里要将的是JDK的动态代理模式。

接口

public interface Forest {
    public void sayHello();
}

实现类

public class ForestImp implements Forest {
    public void sayHello() {
        System.err.println("Hello 蓝枫");
    }
}

建立代理对象和真实对象的联系,这个类需要实现InvocationHandler这个接口

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxy implements InvocationHandler {
    private Object target = null; //用来保存真实对象

    public JdkProxy(Object target) {
        this.target = target;
    }

    public Object bind() { //绑定真实对象和代理对象
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);

    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.err.println("进入invoke方法");
        System.err.println("执行代理逻辑");//这里就相当与客户经理的谈判过程
        Object object = method.invoke(target, args);
        return object;
    }
}

public class JdkProxyTest {
    public static void main(String[] args) {
        ForestImp forestImp = new ForestImp();
        JdkProxy jdkProxy = new JdkProxy(forestImp);//传入真实对象
        Forest proxy = (Forest) jdkProxy.bind();//这个地方就相当与创建了一个ForestImp
        proxy.sayHello();
    }
}

小结:
JDK动态代理需要一个接口才能实现。
newProxyInstance方法包含3个参数。
第一个是类加载器,采用了target本身的类加载器。
第二个是把生成的动态代理对象下挂在哪些接口下,这个写法是放在target实现的接口下。ForestImp对象的接口显然就是Forest。
第三个是定义实现方法逻辑的代理类,this表示当前对象,这个对象必须实现InvocationHandler接口的invoke方法。

invoke方法的三个参数:
proxy,代理对象,就是bind方法生成的对象。
method,当前调度的方法。
args,调度方法的参数。
在使用代理对象调度方法的时候,就会进入到invoke方法里面去。
类比前面的例子,proxy相当于商务对象,target相当于就是你,bind方法是建立商务和你直接的关系。invoke方法就是商务实现的逻辑,由它控制对你的访问。

你可能感兴趣的:(Java设计模式)