mon*_*res 5 java design-patterns asynchronous
我目前正在开发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) {}
Run Code Online (Sandbox Code Playgroud)
那是; 获取数据,您提供的接收器将在未来的某个时间接收操作的结果.
当你需要一次只调用一个方法时,这非常有效,但现在我已经达到了需要一次调用10多个这样的方法的时候,他们需要一次执行一个.
如何以灵活优雅的方式解决这个问题?
谢谢!
小智 7
让我确保我理解..你有一系列接口if1,if2... ifn并且你希望它们都能够处理收到的数据.
首先,如果if1,if2等等与你的两个基本方法完全相同,那将是最好的:public void dataReceived(Data d)和public void onError(String reason).通过它,您可以简单地将一个List或Collection多个接收器传递给fetchData它,它可以遍历集合并调用dataReceived(d)每个接收器.
如果由于某种原因,这是不可行的,我会尝试使用适配器将它们哄骗到类似的界面中fetchData.例如:
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); }
}
Run Code Online (Sandbox Code Playgroud)
现在有了这个,我们可以这样做:
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
还有其他模式可能适用,具体取决于您的确切需求,例如访问者或可能的责任链类型模式,您在链接列表类型构造中将接收器链接在一起,并且每个模式在递归构造中调用下一个 - 这会很好,因为fetchData不需要知道它正在获取一个集合,它只是引用链中的顶级适配器.因此,AbstractIFAdapter将引用另一个AbstractIFAdapter,让我们调用它next,如果引用不为null,它将调用next.dataReceived(d)它自己的dataReceived方法.与ServletFilter每个过滤器获取ServletRequest然后调用的s 类似的想法chain.doFilter(request,response).