Java 使用异步调用解开嵌套if/else结构的模式

Java 使用异步调用解开嵌套if/else结构的模式,java,android,oop,design-patterns,asynchronous,Java,Android,Oop,Design Patterns,Asynchronous,我必须根据从异步调用中获得的许多模型得出一个结果。这些异步调用执行网络调用或UI中断提示,要求用户进行选择 我的第一次尝试是递归调用丑陋的if/else嵌套,如下所示: public void getResult() { if(mModelA == null) { getModelA(); } else if(mModelB == null) { getModelB(mModelA.someData); } else if(mModelB.

我必须根据从异步调用中获得的许多模型得出一个结果。这些异步调用执行网络调用或UI中断提示,要求用户进行选择

我的第一次尝试是递归调用丑陋的if/else嵌套,如下所示:

public void getResult() {
    if(mModelA == null) {
        getModelA();
    } else if(mModelB == null) {
        getModelB(mModelA.someData);
    } else if(mModelB.value == -1) {
        askUserAboutValue();
    } else if(mModelB.value == 5) {
        getModelC();
    } else if(mModelB.value == 3) {
        getModelD();
    } else if(...) {
        ....
    }
}
getModelX和askUserAboutValue方法执行异步任务,当它们完成时,它们编写一些全局变量并在其回调中调用getResult

我想知道是否有一种模式可以简化这个意大利面代码,更重要的是,简化它的单元测试

我认为在更简单的方法中隔离每个检查可能会有所帮助,比如:checkModelA,但它可能存在更好的方法


顺便说一句,这是在Android应用程序的活动中执行的,因此我只能将所有这些代码放在一个类中。

也许一个开关可以更好地实现这一点?或者只使用一个自定义方法来获取mModelB.value返回的整数?请注意整数not int以检查该null


另一个建议是使用多态性,可能创建一个名为getmodelmodelb.value的方法。

切换Case/If-Else问题通常是糟糕设计情况的解决方案

看起来您应该对ModelB进行子类化,以便值5、-1和3是不同的子类,它们都与父类相关,父类将是ModelB

但是从每个If子句中调用的函数来看,-1似乎不是一个子类,而是一个错误。感觉就像在一个函数中,您试图识别应该使用的正确类,并管理一个错误案例。错误情况应在调用的函数内部处理


所以在简历中,这是一团乱?我很乐意为您提供更多帮助,但您必须向我提供更多关于这些价值和模式的信息,以及它们如何相互作用或使用,以便我可以尝试提出更好的设计。您的问题不仅仅在于If/Else函数,它更大。

您是否在执行getResult之前等待所有异步调用完成?