zoukankan      html  css  js  c++  java
  • Java静态代理

    我现在有个需求,有个业务实现接口,根据用户希望查询的数据类型去查询不同的数据,然后解析json数据。例如这个接口为:

    /**
     * 接口
     */
    public interface IProvider {
    
        /**
         * 从json中提取数据
         * @param json
         * @return
         */
        Object getData(String json);
    
        /**
         * 根据datatype获取获取数据的方法名
         * @param datatype
         * @return
         */
        String getDataByMethod(String datatype);
    }

    然后呢我有二个数据类型,需要根据用户传的datatype不同而去获取不同的数据,然后解析获取到的数据

    public class BairongProvider implements IProvider {
        @Override
        public Object getData(String json) {
            //解析json  拿到数据
            System.out.println("[BairongProvider] call");
            return new Object();
        }
    
        @Override
        public String getDataByMethod(String datatype) {
            //根据datatype获取方法
            //map.get(datatype)
            return datatype;
        }
    }
    
    public class YoozooProvider implements IProvider {
        @Override
        public Object getData(String json) {
            System.out.println("[YoozooProvider] call");
            //解析json  拿到数据
            return new Object();
        }
    
        @Override
        public String getDataByMethod(String datatype) {
            //根据datatype获取方法
            //map.get(datatype)
            return datatype;
        }
    }

    好了,这样就算实现了,然后呢我又有个需求,在每次获取数据前要做参数检查,在每次拿完数据返回之前打印日志,这怎么办呢,我又不希望每个IProvider实现类都写一堆同样的代码,那使用代理模式吧。代理模式的核心是代理类和实现类一样都实现同一个接口,然后持有实现类的引用。看代码如下:

    /**
     * 静态代理   实现同样的接口
     */
    public class StaticProviderProxy implements IProvider{
    
        //持有一个真实被代理对象的引用
        IProvider iProvider;
    
        public StaticProviderProxy(IProvider iProvider){
            this.iProvider = iProvider;
        }
    
        @Override
        public Object getData(String json) {
            System.out.println("check");
            //检查参数
            if(json == null || json.isEmpty())
                return null;
            Object object = iProvider.getData(json);
            //打印log
            System.out.println(" log :");
            return object;
        }
    
        @Override
        public String getDataByMethod(String datatype) {
            return null;
        }
    }

    如上所示,在执行具体实现类的getData方法前做参数检查,之后打印日志。

    public class CallClient {
    
    
        public static void main(String[] args) {
            IProvider provider = new StaticProviderProxy(new BairongProvider());
    
            provider.getData("{"data":{}}");
    
            IProvider provider2 = new StaticProviderProxy(new YoozooProvider());
    
            provider2.getData("{"data":{}}");
        }
    }

    看具体调用的时候将实际provider作为参数传递,代理对象在构造函数获取对象引用,然后在实际调用前后加上统一的参数检查和日志打印代码。

    欢迎关注Java流水账公众号
  • 相关阅读:
    冒泡排序
    linux常用命令
    Github上将公共仓库转为私有仓库or私有仓库转为共有仓库
    使用apt更新和升级系统软件
    Django用户认证模块中继承AbstractUser与AbstractBaseUser重写User表的区别
    详解django中的collectstatic命令以及STATIC_URL、STATIC_ROOT配置
    python入门指南
    python包装不上?国内网络问题,使用豆瓣源解决
    nginx入门
    Vue 实现页面刷新(provide 和 inject)
  • 原文地址:https://www.cnblogs.com/guofu-angela/p/9625935.html
Copyright © 2011-2022 走看看