java - 为一般情况实现过滤器设计模式(即过滤器特定的字符串属性)

标签 java oop design-patterns refactoring

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

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

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

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

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

最佳答案

自从 Java 8 中添加了 Stream API 以来,该设计模式已过时。标准现在由 Predicate 接口(interface)定义,并由 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;
    }
}

关于java - 为一般情况实现过滤器设计模式(即过滤器特定的字符串属性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53730596/

相关文章:

java - 如何在 TrustManager 的 checkServerTrusted() 中获取 CertPathValidatorResult?

java - org.hibernate.MappingException : Could not determine type for custom object type

java - JCuda 编译器错误

javascript - 使用构造函数来构建一次性对象是否有原因?

javascript - 递增对象 ID

java - 集成 PHP 和 Java?

javascript - 附加到 JS 对象的 HTML 元素

java - 在多线程环境中摆脱标志/枚举的设计模式

c# - 指定我需要一个实现 2 个或更多接口(interface)的对象的接口(interface)引用

Java:装饰器模式 - 对主要抽象类的引用