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