代理模式

淺唱寂寞╮ 提交于 2020-02-26 23:54:15

代理模式

  • 解决问题
    1. 将次要业务和主要业务做解耦合处理
    2. 次要业务和主要业务的区分:
      1. 次要业务: 起到辅助功能: 辅助主要业务顺利执行, 在业务中往往大量重复出现
    3. 次要业务对开发效率影响:
      1. 加载驱动
      2. 建立连接
      3. 建立数据库操作对象
      4. 推送sql命令到数据库执行并返回处理结果
      5. 销毁connection,statement,result
    4. 代理模式的本质: 行为监听
    5. 代理模式组成:
      1. 声明需要被监听行为
      2. 代理实现类(InvocationHandler): 次要业务和主要业务绑定执行
      3. 代理对象(监听对象)

一个简单例子

public interface StudentService {  
    void study();  
}
public class Student implements StudentService{
    @Override
    public void study(){
        System.out.println(" study...");
    }
}
public class AgentUtil <T> implements InvocationHandler {
    private T object;
    public AgentUtil  bind(T object) {
        this.object = object;
        return this;
    }

    public StudentService register() {
        /**
         * 实例类的所有接口 如果指定拦截某一个接口 用{StudentService.class}
         */
        Class classArray[] = object.getClass().getInterfaces();
        /**
         * loader: 指向被监控的类文件在内存中的真实地址
         * interface: 被监控的类所实现的接口, 这个接口中所声明的方法,就是需要被被监控行为 也是主要行为名称
         * h: 被监测的方法调用时 会执行实现了invocationHandler类的invoke方法
         */
        return (StudentService)Proxy.newProxyInstance(object.getClass().getClassLoader(), classArray, this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before");
        method.invoke(object, args);
        System.out.println("after");
        return null;
    }
}
public class App
{
    public static void main( String[] args )
    {
        Student s = new Student();
        StudentService agent = new AgentUtil().bind(s).register();
        // agent 实际是一个AgentUtil的动态代理 是一个实现类InvocationHandler的类,其中包含被代理对象 s
        agent.study();
    }
}

总结

  1. 代理流程
    • 绑定代理对象 new AgentUtil().bind();
    • 注册实例到代理获取代理对象Proxy.newProxyInstance(object.getClass().getClassLoader(), classArray, this);
    • 执行代理对象对应的方法
     @Override
     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
         System.out.println("before");
         method.invoke(object, args);
         System.out.println("after");
         return null;
     }
    
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!