У меня есть java класс SearchFilterWebPage
, который представляет веб-страницу для интернет-магазина покупок. Все его (фильтр) методы позволяют вам установить фильтр, как на обычном сайте покупок. Например enterPriceRange(min, max), selectBrandsFilter(String...brands), and selectFreeShippingOnlyFilter()
. Приведенный ниже код очень прост и печатает только сообщения.
Я создал функцию applyMultipleFilters(FilterCommand [] functions)
, которая позволяет вызывать любое количество функций фильтра класса SearchFilterWebPage
. Каждая функция фильтра представлена экземпляром FilterCommand
, то есть шаблоном команды. Например, enterPriceRange(min, max), and selectBrandsFilter(String...brands)
представлены EnterPriceRangeFilter and SelectBrandsFilter
классами соответственно.
По сути, я создал класс для представления каждой функции фильтра. Может кто-нибудь сказать мне, если это хорошая идея? Есть ли другой способ, кроме отражения и шаблона команды для реализации applyMultipleFilters(...)
?
Класс с основным методом:
public class SearchFilterWebPage {
public void enterPriceRangeFilter(int min, int max){
System.out.println("enterPriceRangeFilter");
}
public void selectBrandsFilter(String...brands){
System.out.println("selectBrandsFilter");
}
public void selectFreeShippingOnlyFilter(){
System.out.println("selectFreeShippingOnlyFilter");
}
//NOTE - Add 5 or more functions like the above ones !!!
//MAIN METHOD
public static void main(String [] main){
SearchFilterWebPage search = new SearchFilterWebPage();
FilterCommand [] filters = {
new EnterPriceRangeFilter(search, 50, 100),
new SelectBrandsFilter(search, "Adidash", "Nikki", "Pooma")
};
search.applyMultipleFilters(filters);
}
public void applyMultipleFilters(FilterCommand [] functions){
for(FilterCommand fun : functions){
fun.execute();
}
}
}
Вывод:
>>> EXECUTING : enterPriceRangeFilter
>>> EXECUTING : selectBrandsFilter
Код поддержки:
Команда:
public interface FilterCommand {
void execute();
}
Фильтр:
public class EnterPriceRangeFilter implements FilterCommand {
private final int min;
private final int max;
private final SearchFilterWebPage search;
public EnterPriceRangeFilter(SearchFilterWebPage search, int min, int max) {
this.search = search;
this.min = min;
this.max = max;
}
@Override
public void execute() {
//Use min, max.
System.out.print(">>> EXECUTING : " );
search.enterPriceRangeFilter(min, max);
}
}
Фильтр:
public class SelectBrandsFilter implements FilterCommand {
private final String [] brands;
private final SearchFilterWebPage search;
public SelectBrandsFilter(SearchFilterWebPage search, String...brands) {
this.search = search;
this.brands = brands;
}
@Override
public void execute() {
//Use brands.
System.out.print(">>> EXECUTING : ");
search.selectBrandsFilter(brands);
}
}
ОБНОВЛЕНИЕ 1:
Предположим, что существует множество тестов / функций, которые Можно использовать разные комбинации фильтров. Но некоторые из этих тестов / функций используют точно такой же набор фильтров. Итак, я подумал о создании комбинаций фильтров, которые можно было бы повторно использовать в разных тестах / функциях. Есть два возможных решения для создания таких комбинаций, о которых я могу думать в данный момент.
Решение 1 - Создайте класс FilterChoices, который будет предоставлять все данные фильтрации для SearchFilterWebPage. FilterChoices может быть простым POJO с геттерами и сеттерами. Мы могли бы использовать шаблон строителя, чтобы построить это. Незначительная проблема заключается в том, что функция applyMultipleFilters (...) должна будет выполнить несколько проверок, чтобы увидеть, какие все фильтры были установлены в FilterChoices, и вызвать соответствующие функции фильтра.
Решение 2 - Используйте шаблон команды, упомянутый в этом посте. К сожалению, мы заканчиваем тем, что создаем много кода (даже простого), чтобы не проверять, какие функции фильтра вызывать.