我现在有个需求,有个业务实现接口,根据用户希望查询的数据类型去查询不同的数据,然后解析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作为参数传递,代理对象在构造函数获取对象引用,然后在实际调用前后加上统一的参数检查和日志打印代码。