• 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流水账公众号
  • 相关阅读:
    2171 棋盘覆盖
    [网络流24题] 骑士共存
    COGS28 [NOI2006] 最大获利[最大权闭合子图]
    1066: [SCOI2007]蜥蜴
    1877: [SDOI2009]晨跑
    POJ 2125 Destroying the Graph 二分图最小点权覆盖
    LA 3231
    3028: 食物
    PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
    1597: [Usaco2008 Mar]土地购买
  • 原文地址:https://www.cnblogs.com/guofu-angela/p/9625935.html
Copyright © 2020-2023  润新知