Шаблон проектирования - это хороший способ использовать шаблон команды? - PullRequest
2 голосов
/ 18 апреля 2020

У меня есть 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 - Используйте шаблон команды, упомянутый в этом посте. К сожалению, мы заканчиваем тем, что создаем много кода (даже простого), чтобы не проверять, какие функции фильтра вызывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...