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作为参数传递,代理对象在构造函数获取对象引用,然后在实际调用前后加上统一的参数检查和日志打印代码。

posted @ 2018-09-11 10:12  安琪拉的博客(公众号)  阅读(134)  评论(0编辑  收藏  举报