gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:11:07 24 4
gpt4 key购买 nike

基于 SO 上的各种线程(例如 Replacing if else statement with pattern )我知道我可以用 Command 替换多个 if\else 语句图案。

我的情况有点不同。

我有一系列Commands我需要执行每个 Command仅当上一个命令不成功时。

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

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

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

我无法通过通常建议的路线(使用 MapCommand 接口(interface))实现此功能,因为这不会执行下一个 Command如果第一个失败(它也无法检查 Command 是否成功)

什么设计模式可以用来解决这个问题?

最佳答案

正如其他人所说,使用 Chain of Responsibility可以连续尝试不同实现直到成功的模式。

假设您的命令有这个接口(interface),其中处理的请求返回 Result对象如果成功或null如果失败(也可以使用 boolean 值或 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;
}
}

关于java - 用设计模式替换多个 If\Else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43102499/

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