• 代理模式


    静态代理

    角色

    • 公共接口:
      封装了需要被代理的方法
    • 真实对象:
      被代理方
    • 代理对象:
      代理方

    UML类图

    代理对象持有对真实对象的引用,并且是一种一一对应的引用,此二者都实现公共接口(即实现需要被代理的方法),代理对象可以自行决定被代理对象的方法以何种方式执行、以及执行前后分别还需执行何种逻辑。

    例子代码

    • 公共接口:
    public interface Subject {
        void request();
    }
    
    
    • 真实对象:
    public class RealSubject implements Subject{
        @Override
        public void request() {
            System.out.println("From real subject");
        }
    }
    
    • 代理对象
    public class ProxySubject implements Subject{
        private RealSubject realSubject;
    
        @Override
        public void request() {
    
            this.preRequest();
    
            if(null == realSubject){
                realSubject = new RealSubject();
            }
            realSubject.request();
    
            this.postRequest();
        }
    
        private void preRequest(){
    
        }
    
        private void postRequest(){
    
        }
    }
    
    • 调用方式
    public class Client {
        public static void main(String[] args) {
            Subject subject = new ProxySubject();
            subject.request();
        }
    }
    

    动态代理

    动态代理需要jdk动态代理API的支持,本质是动态创建代理类和代理对象。

    • InvocationHandler:调用处理器
      在调用处理器中定义代理对象的方法执行逻辑(通过实现invoke方法),调用处理器持有一个Object引用可以保存所有对象。
    • Proxy:用于动态创建代理类和代理对象

    代码示例

    public class VectorProxy<T> implements InvocationHandler{
        private T proxyObj;
    
        public VectorProxy(T proxyObj) {
            this.proxyObj = proxyObj;
        }
    
        public  T createProxyObject(Object obj){
            Class<?> classType = obj.getClass();
            return (T)Proxy.newProxyInstance(classType.getClassLoader(),classType.getInterfaces(),new VectorProxy(obj));
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("before calling: " + method);
    
            if(null != args){
                for (Object object: args){
                    System.out.println(object);
                }
            }
            Object object = method.invoke(proxyObj,args);
    
            System.out.println("after calling: " + method);
            System.out.println(object == null);
            return object;
        }
    
        public static void main(String[] args) {
            List v =  new VectorProxy<List>(new Vector<>()).createProxyObject(new Vector<>());
            v.add("a");
            v.add("b");
    
        }
    }
    
  • 相关阅读:
    学习也可以有趣,喜欢上pandas,你该这么学!No.4
    Umbral:新型分散式密钥管理系统的代理重加密方案
    同态加密
    解决方案 | MySQL DBA主从复制出错怎么办?
    干货分享 | 史上最全Oracle体系结构整理
    点开,看一段,你就会喜欢上学习pandas,你该这么学!No.3
    mysql集群搭建(PXC)
    Centos7 离线安装mysql 5.6详细步骤
    tomcat别名配置多域名访问配置
    关于打印机状态的获取【转】
  • 原文地址:https://www.cnblogs.com/Theshy/p/8521959.html
Copyright © 2020-2023  润新知