【问题标题】:Implement Filter Design Pattern for generic cases (i.e. filter specific String attributes)为通用案例实现过滤器设计模式(即过滤器特定的字符串属性)
【发布时间】:2018-12-11 18:52:07
【问题描述】:

我正在实现此设计模式(过滤器)的细微变化 https://www.tutorialspoint.com/design_pattern/filter_pattern.htm

我遇到的是,我需要过滤一个对象列表的字符串属性(比如“名称”)。

这里的问题是,我应该为现有的每个名称实现一个过滤器/标准类吗? 我真的不这么认为。应该有更好、更模块化的方式来适应这个:

请看,java 中的接口要求其中的每个方法都由类实现。这意味着,如果我想创建一个 NameCriteria 类,我不能给它的方法meetCriteria(List<Person> persons) 两个参数(比如要过滤的字符串)。

是否有一种实用且硬编码较少的方法来实现此模式,所以我可以创建一个meetCriteria(List<Person> persons, String name) 方法,或任何解决方法?

【问题讨论】:

  • 我目前正在对设计模式进行外部过滤功能,但感觉不自然。如果我没有得到更好的解决方案,我会在几天后在这里发布我的解决方法。

标签: java oop design-patterns refactoring


【解决方案1】:

自从在 Java 8 中添加 Stream API 以来,该设计模式已过时。标准现在由 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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多