确定正确状态字符串的条件逻辑

时间:2019-02-19 22:25:07

标签: java design-patterns

Java应用程序中有一个状态变量,可以根据许多条件将其设置为许多法规之一。状态字段是一个字符串。满足条件后,应立即返回状态,如下:

例如

String status = "";

if (condition1) {
  return "STATUS_1";
} else if (condition2) {
  return "STATUS_2";
} else if (condition3) {
  return "STATUS_3";
} else if (condition4) {
  return "STATUS_4";
}
...
else if (condition10) {
  return "STATUS_10";
}

我已经考虑过哪种模式最适合使此代码更可靠...例如如果需要一个新条件,则需要对该类进行编辑以添加新条件,这将破坏打开/关闭SOLID原理

我已经研究了策略模式,特别是“用策略替换条件逻辑”,但是当您只想决定要使用的一种计算/操作时,这似乎更合适...我的情况似乎不合适策略模式作为我的逻辑决定状态,而不是确定要执行的单个操作-我需要运行所有条件,直到一个条件成立为止

我想知道以下模式是否可以工作...

具有如下界面

public interace StatusCondition {
  boolean condition(Context context);
  String getStatus();
}

实现如下:

public class StatusAStatusCondition implements StatusCondition {

  boolean condition(Context context){
    return context.getValue1() == 0 && context.getValue2().equals("A");
  }

  String getStatus(){
    return "STATUS_A";
  }
}

这将允许按顺序执行StatusCondition类的列表,并返回第一个StatusCondition的状态,其中condition()方法返回true。例如:

public String getStatus(List<StatusCondition> statusConditions) {
  for (StatusCondition statusCondition : statusConditions) {
    if (statusCondition.condition()) {
      return statusCondition.getStatus();
    }
  }
  return "";
}


usage:

List<StatusCondition> statusConditions = new ArrayList<>();
statusConditions.add(statusAStatusCondition);
statusConditions.add(statusBStatusCondition);
statusConditions.add(statusCStatusCondition);
statusConditions.add(statusDStatusCondition);
statusConditions.add(statusEStatusCondition);
statusConditions.add(statusFStatusCondition);
...

String status = getStatus(statusConditions);

对我来说,这解决了开放式封闭原则问题,并确保实现是单一职责...我的问题是,我建议如何改善这种模式,或者有一种更适合我的情况的模式? / p>

1 个答案:

答案 0 :(得分:1)

首先,您绝对正确地认为原始的if / else梯形图违反了Open / Closed Principle。其次,将状态值转换为接口是离开stringly-typed programming的正确步骤。第三,您的解决方案本质上是Chain of Responsibility Pattern。这是解决此问题的绝佳方法。总之,您的直觉很明显。