使用设计模式改进 returns 枚举的许多 ifs

Improve many ifs that returns enumeration with Design Patterns

当然,当我们谈论if的数量时,我们尝试使用Strategy Pattern。但是当我想在 if().

中分离条件时呢?

例如,我正在开发一款有很多可能性的游戏:

我有一个 class 游戏。我检查了方法和 return 枚举。

if(TieByPoints()) {
  return Result.TieByPoints;
}
if(TieByTimeOver()) {
  return Result.TieByTimeOver;
}
if(JustOnePlayerWin()) {
  return Result.PlayerWin;
}
if(ManyPlayersWin()) {
  return Result.PlayerWin;
}

但可以创建许多其他 possibilites/rules。 那么,有没有办法在不同的class中分开呢?把这些条件放在不同的地方?

您没有解释足够的细节来肯定地说,但一种方法是使用注册表模式,其中注册表保存结果生产者。

类似

public enum Result { None, TieByPoints, ... };

public class ResultSupplierRegistry {
  /** Singleton instance of registry. */
  public static final ResultProducerRegistry INSTANCE = new ResultSupplierRegistry();

  private final Map<Result, Supplier<Boolean>> resultSuppliers = new HashSet<>();

  private ResultSupplierRegistry() {}

  public void register(Result result, Supplier<Boolean> resultSupplier) {
    resultSuppliers.put(result, resultSupplier);
  }

  public Result getResult() {
    return resultSuppliers.entrySet().stream().filter(e -> e.getValue().get()).map(Entry::getKey).findFirst().orElse(Result.None);
  }
}

现在您需要一些初始化来填充注册表。我在这里没有采取任何关于线程安全的预防措施。如果可以通过多个线程进行初始化,则需要修复它。