用模式替换if else语句

我有一个if else声明可能在不久的将来增长。

public void decide(String someCondition){ if(someCondition.equals("conditionOne")){ // someMethod("someParameter"); }else if(someCondition.equals("conditionTwo")){ // someMethod("anotherParameter"); } . . else{ someMethod("elseParameter"); } } 

因为,这已经看起来很混乱,我认为如果我可以在这里应用任何设计模式会更好。 我查看了策略模式,但我不确定这是否会减少if else条件。 有什么建议么?

这是一个经典的Replace Condition调度程序,在Refactoring to Patterns一书中使用了Command 。

在此处输入图像描述

基本上你为旧的if / else组中的每个代码块创建一个Command对象,然后制作一个这些命令的Map,其中键是你的条件字符串

 interface Handler{ void handle( myObject o); } Map commandMap = new HashMap<>(); //feel free to factor these out to their own class or //if using Java 8 use the new Lambda syntax commandMap.put("conditionOne", new Handler(){ void handle(MyObject o){ //get desired parameters from MyObject and do stuff } }); ... 

然后代替你的if / else代码:

  commandMap.get(someCondition).handle(this); 

现在,如果您需要稍后添加新命令,只需添加到哈希。

如果要处理默认情况,可以使用Null Object模式来处理条件不在Map中的情况。

  Handler defaultHandler = ... if(commandMap.containsKey(someCondition)){ commandMap.get(someCondition).handle(this); }else{ defaultHandler.handle(this); } 

Martin Fowler的一般建议是将条件替换为多态 。

在设计模式方面,这通常是策略模式用策略替换条件逻辑 。

如果你有一小组有限的条件,我建议使用枚举来实现策略模式(在枚举中提供一个抽象方法并为每个常量覆盖它)。

 public enum SomeCondition{ CONDITION_ONE{ public void someMethod(MyClass myClass){ //... } }, CONDITION_TWO{ public void someMethod(MyClass myClass){ } } public abstract void someMethod(MyClass myClass); } public class MyClass{ //... public void decide(SomeCondition someCondition){ someCondition.someMethod(this); } } 

如果它只是你想要选择的参数,那么你可以这样定义枚举:

 public enum SomeCondition{ CONDITION_ONE("parameterOne"), CONDITION_TWO("parameterTwo"); private SomeCondition(String parameter){ this.parameter = parameter; } public String getParameter(){ return parameter; } } public class MyClass{ //... public void decide(SomeCondition someCondition){ someMethod(someCondition.getParameter()); } } 

我想你一定已经考虑过了,但如果你使用的是JDK 7或更高版本,你可以打开字符串。 这样你的代码看起来比一堆if-else语句更干净。