Замена 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"); } } 

Поскольку, это уже выглядит беспорядочным, я думаю, было бы лучше, если бы я мог применять любые шаблоны дизайна здесь. Я просмотрел шаблон страtagsи, но я не уверен, что это уменьшит если условие else. Какие-либо предложения?

Это classический диспетчер условий замещения с командой в книге «Рефакторинг в шаблоны».

введите описание изображения здесь

В основном вы создаете объект Command для каждого из блоков кода в вашей старой группе if / else, а затем создаете карту тех команд, где ключи являются вашими условиями. Строки

 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); 

Теперь, если вам нужно позже добавить новые команды, вы просто добавляете hash.

Если вы хотите обрабатывать случай по умолчанию, вы можете использовать шаблон Null Object для обработки случая, когда условие отсутствует на карте.

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

Общая рекомендация Мартина Фаулера заключается в замене условного на polymorphism .

Что касается шаблонов проектирования, то часто это будет шаблон страtagsи « Заменить условную логику со страtagsей» .

Если у вас есть небольшой конечный набор условий, я рекомендую использовать перечисление для реализации шаблона страtagsи (предоставить абстрактный метод в перечислении и переопределить его для каждой константы).

 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); } } 

Если это действительно просто параметр, который вы хотите выбрать, тогда вы можете определить enum, как это:

 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.

  • Каково обоснование наличия сопутствующих объектов в Scala?
  • Зачем избегать подтипов?
  • «Закрытие - это объекты бедного человека и наоборот». Что это значит?
  • Шаблоны проектирования доступа к данным
  • Как быстро определить, переопределен ли метод в Java
  • Реферирование ссылочного типа - новая ссылочная переменная, созданная каждым циклом в цикле, если объявлена ​​в нем?
  • Разница между объектом и экземпляром
  • Перегруженный выбор метода на основе реального типа параметра
  • В чем смысл и аргументы Открытого / Закрытого Принципа?
  • Отправка сообщений между двумя объектами JPanel
  • Java `final` метод: что он обещает?
  • Давайте будем гением компьютера.