gpt4 book ai didi

java - 在 java 中链接异步调用的最优雅的解决方案?

转载 作者:搜寻专家 更新时间:2023-10-31 19:40:53 26 4
gpt4 key购买 nike

我目前正在开发 Android 应用程序的表示层。

我正在使用的 api 看起来像这样:

public interface errorInterface{
public void onError(String reason);
}

public interface if1 extends errorInterface{
public void dataReceived1(Data data);
}
public interface if2 extends errorInterface{
public void dataReceived2(Data data);
}

public void fetchData1(if1 receiver) {}
public void fetchData2(if2 receiver) {}

也就是说;要获取数据,您需要提供一个接收器,它将在未来的某个时间接收操作结果。

当你一次只需要调用一个方法时,这种方法非常有效,但现在我已经到了需要一次调用 10+ 个这样的方法的地步,而且它们需要一次执行一个。

我怎样才能以灵活而优雅的方式解决这个问题?

谢谢!

最佳答案

让我确定我明白了..你有一系列接口(interface) if1, if2.. ifn 并且你希望它们全部能够处理接收到的数据。

首先,最好是 if1if2 等与您的两个基本方法都具有相同的接口(interface):public void dataReceived(Data d)public void onError(String reason)。有了它,您可以简单地将接收器的 ListCollection 传递给 fetchData,它可以遍历集合并调用 dataReceived (d) 在每一个上。

如果出于某种原因,那是行不通的,我会尝试使用适配器将它们引入类似的 fetchData 接口(interface)。例如:

public interface DataReceiver extends ErrorInterface {
public void dataReceived(Data d);
//or just scrap the ErrorInterface all together and make these into 1 interface
}

public class AbstractIFAdapter<T extends ErrorInterface> implements DataReceiver {
private T target;
public AbstractIFAdapter(T target) { this.target = target);
public void onError(String reason) { target.onError(reason); }
protected T getTarget() { return target; }
}

public class IF1Adapter extends AbstractIFAdapter<IF1> {
public IF1Adapter(IF1 target) { super(target); }
public dataReceived(Data d) { getTarget().dataReceived1(d); }
}

public class IF2Adapter extends AbstractIFAdapter<IF2> {
public IF2Adapter(IF2 target) { super(target); }
public dataReceived(Data d) { getTarget().dataReceived2(d); }
}

现在有了它,我们可以做这样的事情:

List<DataReceiver> dataReceivers = new ArrayList<DataReceiver>();
dataReceivers.add(new IF1Adapter(someIf1Implementation));
dataReceivers.add(new IF2Adapter(someIf2Implementation));
fetchData(dataReceivers);

public void fetchData(Collection<DataReceiver> receivers) {

try {
Data d = getSomeData();
for (DataReceiver dr : receivers) {
dr.dataReceived(d);
}
}
catch (Exception e) {
for (DataReceiver dr : receivers) {
dr.onError(e.getMessage());
}
}
}

根据您的确切需求,还有其他可能适用的模式,例如访问者或责任链类型模式,您可以在链表类型构造中将接收者链接在一起,每个接收者以递归方式调用下一个构造 - 这会很好,因为 fetchData 不需要知道它正在获取一个集合,它只是获取对链中 top 适配器的引用。因此,AbstractIFAdapter 将引用另一个 AbstractIFAdapter,我们称它为 next,如果引用不为 null,它将调用 next.dataReceived(d) 在它自己的 dataReceived 方法中。类似于 ServletFilter 的想法,其中每个过滤器获取 ServletRequest 然后调用 chain.doFilter(request,response)

关于java - 在 java 中链接异步调用的最优雅的解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9988932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com