这是基本的OO。您需要抽象出您正在尝试实现的内容 - 从您使用的机制中加载数据 - 实现数据库查询或Web服务调用。
这样的设计通常会涉及一个接口,该接口定义可以完成什么的合同,然后是根据其实现情况实现的多个实现类。
例如,你想最终,看上去像一个接口:
public interface DataLoader
{
public Collection<Data> loadData() throws DataLoaderException;
}
那么你将不得不实现比如JdbcDataLoader
,WebServiceDataLoader
等。在你的情况,你就需要另一种类型的实现是给定DataLoader
的一个或多个实例,每个运算每个累计汇总结果。这个实现看起来像这样:
public class AggregatingDataLoader implements DataLoader
{
private Collection<DataLoader> dataLoaders;
private ExecutorService executorService;
public AggregatingDataLoader(ExecutorService executorService, Collection<DataLoader> dataLoaders)
{
this.executorService = executorService;
this.dataLoaders = dataLoaders;
}
public Collection<Data> loadData() throws DataLoaderException
{
Collection<DataLoaderCallable>> dataLoaderCallables = new ArrayList<DataLoaderCallable>>();
for (DataLoader dataLoader : dataLoaders)
{
dataLoaderCallables.add(new DataLoaderCallable(dataLoader));
}
List<Future<Collection<Data>>> futures = executorService.invokeAll(dataLoaderCallables);
Collection<Data> data = new ArrayList<Data>();
for (Future<Collection<Data>> future : futures)
{
add.addAll(future.get());
}
return data;
}
private class DataLoaderCallable implements Callable<Collection<Data>>
{
private DataLoader dataLoader;
public DataLoaderCallable(DataLoader dataLoader)
{
this.dataLoader = dataLoader;
}
public Collection<Data> call()
{
return dataLoader.load();
}
}
}
你需要添加一些超时和异常处理逻辑,但你得到的主旨。
另一个重要的是你的通话代码应该只使用DataLoader
接口,这样你就可以在测试过程中交换不同的实现或者使用模拟。
好的,问题是什么?你有什么尝试?什么阻止你这样做? – 2013-04-26 10:09:33
所以,我想找到准备好的解决方案,也许框架或类似的东西。但只有一件事我发现它是UnityJDBC,但它只适用于关系数据库,并没有元信息和查询到期时间 – 2013-04-26 10:56:17