gpt4 book ai didi

java - 当 similarly if-else 增长时应该使用什么设计模式?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:42:35 27 4
gpt4 key购买 nike

我们有一些代码如下:

public class ErrorCodeUtil {
public static void handleErrorCode(String errorCode) {
if (errorCode.equals("1")) {
handleErrorCode1();
} else if (errorCode.equals("2")) {
handleErrorCode2();
} else if (errorCode.equals("3")) {
handleErrorCode3();
} else {
handleErrorCodeByDefault(errorCode);
}
}

public static void logByErrorCode(String errorCode) {
if (errorCode.equals("1")) {
logErrorCode1();
} else if (errorCode.equals("2")) {
logErrorCode2();
} else if (errorCode.equals("3")) {
logErrorCode3();
} else {
logErrorCodeByDefault(errorCode);
}
}
//... a lot of method about error code
}

如你所见,我们有一个 Util 来处理所有关于 ErrorCode 的事情,当我们想向错误代码添加特殊逻辑时,我们必须更改该实用程序类的许多方法。

正如预期的那样,错误代码的值在很大范围内变化(可能是“112345”或“error_code_001”)。那么哪种设计模式适合这种情况?

最佳答案

我会实现一个 decision table .

该表将包含一个或多个 Predicate 之间的一组映射。 s 作为键和 Function作为一个值。如果 Predicate条件满足,则对应Function被执行。如果没有 Predicate满足条件,则默认 Function应该被执行。这可以(轻松地)取代庞大的“if-else”语句,并且应该更易于维护。

如何Predicate应该是什么样子?它应该需要 String (在你的情况下)并且应该返回 boolean指示是否满足条件:

interface Predicate {
public boolean test(String x);
}

在决策表中,您将添加此接口(interface)的(匿名)实现作为键。

提示:如果您已经在使用 Java8,更好的是,有一个内置的 Predicate<T>界面。但如果你不是,那么你可以介绍一个 Predicate自己的界面。 :-)

Function对于决策表的值将是一个类似的界面。它可能(也可能不)使用输入参数并且应该返回 void。在 Java8 中,这称为 Consumer。 ,但是在我的示例中,我将坚持使用 Function命名:

interface Function<T> {
void apply(T t);
}

通过在 Predicate 之间构建对作为键和 Function<ErrorCodeUtil>作为一个值,我们将填充决策表。当 Predicate满足条件,那么我们将调用相应的 Function.apply()方法:

决策表本身可以是一个简单的 Map<Predicate, Function<ErrorCodeUtil>> :

Map<Predicate, Function<ErrorCodeUtil>> decisionTable = new HashMap<>();

并且您应该在构造时或任何您希望的时候填充它(就在 handleErrorCode() 方法逻辑之前):

Predicate equalsOne = new Predicate() { 
public void test(String x) {
return "1".equals(x);
}
};
Function<ErrorCodeUtil> actionOne = new Function<ErrorCodeUtil>() {
public void apply(ErrorCodeUtil t) {
t.handleErrorCode1();
}
}

decisionTable.put(equalsOne, actionOne);

对于其他“条件- Action ”对,包括默认 Action (即最后一个 else 语句),Predicate 也是如此将始终返回 true .

请注意,在 Java8 中,仅使用 lambda 就可以显着减少这些匿名类。

最后,您的“if-elseif”语句将被重构为一个简单的循环:

for (Map.Entry<Predicate, Function<ErrorCodeUtil>> entry: decisionTable.entrySet()){
Predicate condition = entry.getKey();
Function<ErrorCodeUtil> action = entry.getValue();
if (condition.test(errorCode)) {
action.apply(this);
}
}

因此,每次添加新条件时,您都不必触摸 handleErrorCode(String error)方法,但你必须引入一个新的(匿名的)实现 PredicateFunction.put()它进入决策表。

关于java - 当 similarly if-else 增长时应该使用什么设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33279154/

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