JDK动态代理模式

代理模式分为静态代理和动态代理,关于动态代理参考我前一篇文章静态代理
但是静态代理的问题就是灵活性不太好,我可能需要动态的改变被代理的类,这样可以增加扩展性和灵活性。依赖java反射在运行期间确定到底由具体的实现类去实现完成代理者的调用功能。
这里解耦了代理者也被代理之间的耦合性,可以动态的选择需要代理的类,这样可以大大增加系统的可扩展性,利用了大量的反射虽然灵活性达到了,但是反射的性能比直接调用的性能会降低不少。

// 定义一个接口,这里我们类比员工
interface Employee {
    // 我们工作就是编程
    void program();

}
// 程序员也是员工
class Developer implements Employee {

    @Override
    public void program() {
        System.out.println("我是开发者,真正在写代码...");
    }
}

代理类:

// 技术总监
class CTO implements InvocationHandler {

    // 被代理的类
    private Object target;

    public Object getInstance(Object target) {
        this.target = target;
        return  java.lang.reflect.Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    } 

    // 这个Object为被代理的类方法的返回参数,proxy为代理类,method为被代理类的方法,args为被调用类的参数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        //判断是否有了员工
        if(target != null) {
            // 这里代理之前
            System.out.println("before proxy executed..");
            // 这里完成代理的功能
            result = method.invoke(target, args);
            // 在代理之后
            System.out.println("after proxy executed...");

        } else {
            System.out.println("还没有代理的员工");
            result = null;
        }
        return result;
    }
}

就是在代理人这个代码块里没有了被代理的类。与被代理的类完成解耦。
客户端调用:


        CTO cto = new CTO();
        Employee employee = (Employee)cto.getInstance(new Developer());
        employee.program();

执行结果:

before proxy executed..
我是开发者,真正在写代码...
after proxy executed...

你可能感兴趣的:(JDK动态代理模式)