Шаблон проектирования isApplicable / apply

В этой статье пойдёт речь о шаблоне проектирования, который позволит нам избавиться от больших switch-ей в наших проектах.

Представьте, что мы пишем нечто вроде калькулятора. У нас есть список операций. В нашем примере четыре элемента перечисления, но на самом деле их может быть очень много:

И метод вычисления результата выражения с двумя операндами, реализующий разные варианты операций с помощью оператора switch:

В данном случае выглядит неплохо, но различных видов операций может быть очень много. При дальнейшем добавлении новых значений в Operation наш switch может стать очень большим, и его будет очень сложно читать.

В этом случае имеет смысл применить шаблон проектирования isApplicable / apply. Он заключается в том, что мы пишем базовый интерфейс с методом isApplicable, который проверяет, будет ли этот экземпляр работать с нашей операцией, и методом apply, который будет осуществлять обработку в случае, если isApplicable вернёт true.

Создадим базовый интерфейс:

У нас есть четыре операции, которые будут иметь следующие реализации:

Пример использования:

Обратите внимание, что мы использовали способ создания неизменяемых коллекций, добавленный в Java 9.

Про Stream API и лямбда выражения читайте в моём учебнике.

Подобный шаблон проектирования полагается использовать в случаях, когда switch получается слишком большим и трудночитаемым. В качестве бонуса получаем возможность легкого добавления новых Calculator-ов, так как мы можем сделать их бинами Spring Framework, а в List через @Autowired получать сразу все существующие Calculator-ы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *