Реализовать шаблон проектирования фильтра для общих случаев (т. Е. Отфильтровать специфические атрибуты String) - PullRequest
0 голосов
/ 11 декабря 2018

Я реализую небольшое изменение этого шаблона проектирования (фильтр) https://www.tutorialspoint.com/design_pattern/filter_pattern.htm

Что я натолкнулся на то, что мне нужно отфильтровать атрибут String (скажем, "name ") списка объектов.

Вопрос здесь заключается в том, должен ли я реализовать класс фильтра / критерия для каждого существующего имени? Я действительно так не думаю. Должен быть лучший и более модульный способ адаптировать это:

Видите, интерфейсы в java требуют, чтобы каждый метод в них был реализован классами.Это означает, что если я хочу создать класс NameCriteria, я не могу дать его методу meetCriteria(List<Person> persons) два параметра (например, String для фильтрации).

Существует ли практичный и менее жестко закодированный способ реализации этого шаблона, поэтомуЯ могу сделать meetCriteria(List<Person> persons, String name) метод или любой обходной путь к этому?

1 Ответ

0 голосов
/ 12 декабря 2018

Этот шаблон проектирования устарел с момента добавления API Stream в Java 8. Критерии теперь определяются интерфейсом Predicate и выполняются методом filter.

public static void main(String... args) {
    Person john = new Person("John Doe", Gender.MALE, MaritalStatus.MARRIED);
    Person jane = new Person("Jane Doe", Gender.FEMALE, MaritalStatus.MARRIED);
    Person joe  = new Person("Joe Bloe", Gender.MALE, MaritalStatus.SINGLE);

    Set<Person> husbands = Stream.of(john, jane, joe)
            .filter(person -> person.gender == Gender.MALE)
            .filter(person -> person.maritalStatus == MaritalStatus.MARRIED)
            .collect(Collectors.toSet());
}

enum Gender {  MALE, FEMALE  }
enum MaritalStatus { MARRIED, SINGLE }
static class Person {
    final String name;
    final Gender gender;
    final MaritalStatus maritalStatus;

    Person(String name, Gender gender, MaritalStatus maritalStatus){
        this.name = name;
        this.gender = gender;
        this.maritalStatus = maritalStatus;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...