当前位置: 首页 > 知识库问答 >
问题:

用设计模式替换多个If\Else

陈翰林
2023-03-14

基于SO上的各种线程(例如。用模式替换if else语句)我知道我可以用< code>Command模式替换多个if\else语句。

我的情况有点不一样。

我有一系列命令,只有当前一个命令不成功时,我才需要执行每个命令

例如,假设我需要从一个假设的网页中检索文本——我可以使用屏幕抓取直接从页面中抓取文本,也可以从API中获取文本。如果屏幕抓取不成功,我只想从API获取文本。换句话说,如果“scrap”命令不起作用,我只会执行“fetch”命令。

在这种情况下,我将测试抓取的字符串是否为空或等于 null,然后执行第二个命令。如果第二个命令也不成功,我将执行第三个命令,依此类推。

重要的一点是,我们只在某个条件为真/假时才执行后续命令。每个命令的条件始终相同,但将来命令的数量可能会增加。

我无法通过通常建议的路由(使用Map命令接口)实现这一点,因为如果第一个失败,它不会执行下一个命令(它也无法检查命令是否成功)

可以使用什么设计模式来解决此问题?

共有2个答案

广献
2023-03-14

人们建议使用< code >责任链模式,但是当我思考这个问题时,我想到我可以使用< code >命令模式的变体来解决这个问题。它是这样工作的。

用实现< code>Command接口的相应类替换每个< code>if语句。在我们的例子中,我将实现类< code > ScreenScrapeTextCommand 和< code > FetchTextFromAPICommand 。因为每个类都将实现< code>Command接口,所以我们将为每个类添加< code>execute()方法(该方法将实际执行我们需要的功能,如屏幕抓取或从API获取)。

然后我们将创建一个包含所有相关命令的新类。让我们把这个类称为< code > GetTextCommandCenter 。该类将包含< code >公共列表形式的< code >命令的< code >列表

commandList.add(new ScreenScrapeTextCommand();
commandList.add(new FetchTextFromAPICommand();

然后我们可以将 if\else 链替换为以下内容:

public String replaceIfElseWithCommand()..

String text = null;
int commandIndex = 0;

while (text == null && text == someCondition)
{

text = new GetTextCommandCenter().commandList(commandIndex).execute();
commandIndex++;
}

return text;

}

一旦命令成功,while循环中的条件将失败,方法将相应地返回。

这样,我们可以通过向 CommandCenter 类添加更多类来轻松添加更多命令,或者快速更改单个命令的优先级。

我认为这是对我的问题的一个简单而直接的解决方案(但是如果您认为责任链模式更合适以及您为什么这么认为,请发表评论)

邢高爽
2023-03-14

正如其他人所说的,使用责任链模式,可以不断尝试不同的实现,直到一个成功。

假设您的命令有这样一个接口,如果成功,被处理的请求返回一个< code>Result对象,如果失败,返回< code>null(也可以使用boolean或< code>Optional或任何您想要的值)

public interface Command{

  Result handle( Request request);
}

然后您的链接命令可以包装其他几个命令并尝试每个命令,直到有工作。

public class ChainedCommand implements Command {
    //could also be set in a constructor instead
    List<Command> commandChain = Arrays.asList( new ScrapperCommand(),
                                            new ApiCommand());


    public Result handle( Request request){

         Result result = null;
         Iterator<Command> iter = commandChain.iterator();
         while( result ==null && iter.hasNext()){
              result = iter.next().handle(request);
         }

         return result;
    }
}
 类似资料:
  • 基于SO上的各种线程(例如。用设计模式替换多个If\Else或用模式替换if else语句)我知道我可以用< code >命令模式替换多个< code>if\else语句。 但对于我这个级别的人来说,答案远不是简单或详细的。我会有60个会阻塞。我做了一些研究,发现命令模式是最好的。搜索关于如何一步一步的教程似乎很难,因为我发现的都是复杂的事情。相信我,如果我没有在网上做大量的重新搜索和放弃,我不会

  • 我有一个if else语句,它可能会在不久的将来增长。 因为,这看起来已经很乱了,我想如果我能在这里应用任何设计模式会更好。我研究了战略模式,但我不确定这是否会降低其他条件。有什么建议吗?

  • 当我们使用时,我们通常有类,它有一个函数,我们在这个函数中传递参数,我们在传递参数的函数中有或逻辑,以决定返回哪个工厂。是创建传递的参数、枚举或对象,然后在这些对象中具有返回哪个工厂的逻辑会更好。例如: 让我们这样说吧,我们的工厂制造商是通过枚举国家代码来决定工厂的。 取而代之的是: 和枚举将进行如下修改: 但我不认为这是普遍遵循的。为什么会这样?为什么我们不能让传递的参数始终是一个对象,并且在对

  • 我试图制作一个模糊的自动完成建议框,突出显示带有HTML标记的搜索字符 例如,如果用户输入“ldi”,其中一个建议是“莱昂纳多·迪卡普里奥”,则期望的结果是“莱昂纳多·迪卡普里奥”。每个字符的第一次出现将按外观顺序高亮显示。 我现在正在做的是: 导致 现在我想用

  • 假设我有'abbc'字符串,我想替换: ab- 如果我尝试两次替换,结果不是我想要的: 那么我可以使用什么sed命令来替换下面的命令呢? 编辑:实际上文本可能有2个以上的模式,我不知道我需要多少替换。因为有人回答说,是一个流编辑器,它的替代品是贪婪的,我想我需要使用一些脚本语言来实现这一点。

  • 问题内容: 我想为re.sub提供替代的替换模式。 假设我有两种搜索模式可供选择,如下所示: 而不是提供一个替换模式,我想以某种方式捕获匹配哪个搜索模式的替换项并提供替换模式。这可能吗?谢谢。 PS。这里的代码细节无关紧要,这是一个普遍的问题。 问题答案: 您可以将函数传递给。在该函数中,您可以根据捕获的组返回所需的值。一个简单的代码说明: 该函数检查匹配是否成功,并根据捕获的组返回替换字符串。如