针对一般情况实施过滤器设计模式(即过滤器特定的String属性)

时间:2018-12-11 18:52:07

标签: java oop design-patterns refactoring

我正在对该设计模式(过滤器)进行细微改动 https://www.tutorialspoint.com/design_pattern/filter_pattern.htm

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

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

请参见,java中的接口要求它们中的每个方法都必须由这些类实现。这意味着,如果要创建NameCriteria类,则无法为其方法meetCriteria(List<Person> persons)提供两个参数(例如要过滤的字符串)。

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

1 个答案:

答案 0 :(得分: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;
    }
}