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



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

我遇到的问题是,我需要过滤对象列表的String属性(比如"name"(。

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

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

有没有一种实用且不太硬编码的方法来实现这个模式,这样我就可以制作一个meetCriteria(List<Person> persons, String name)方法,或者任何解决方法?

由于在Java 8中添加了StreamAPI,因此该设计模式已经过时。标准现在由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;
}
}

最新更新