过滤器模式(Filter Pattern)
Java 过滤器模式(Filter Pattern)是一种结构型设计模式,它允许你使用不同的标准来过滤一组对象,从而去除其中不需要的元素。 使用场景
-
当你需要从一个集合中过滤出一部分元素时。
-
当你需要根据不同的标准来过滤同一个集合时。
-
当你需要在一个集合中根据不同标准来组合过滤器时。
代码实现
假设有一个 Person 类,包含姓名、年龄、性别等属性,我们可以定义一个过滤器接口 Filter,其中包含一个过滤方法 filter,用于过滤出符合某种条件的人。
public interface Filter {
List<Person> filter(List<Person> persons);
}
定义实现了 Filter 接口的具体过滤器
public class MaleFilter implements Filter {
@Override
public List<Person> filter(List<Person> persons) {
return persons.stream()
.filter(person -> person.getGender().equals("MALE"))
.collect(Collectors.toList());
}
}
public class FemaleFilter implements Filter {
@Override
public List<Person> filter(List<Person> persons) {
return persons.stream()
.filter(person -> person.getGender().equals("FEMALE"))
.collect(Collectors.toList());
}
}
public class AgeFilter implements Filter {
@Override
public List<Person> filter(List<Person> persons) {
return persons.stream()
.filter(person -> person.getAge() > 18)
.collect(Collectors.toList());
}
}
最后,我们可以定义一个 FilterChain 类,用于组合多个过滤器
public class FilterChain implements Filter {
private List<Filter> filters;
public FilterChain(List<Filter> filters) {
this.filters = filters;
}
@Override
public List<Person> filter(List<Person> persons) {
List<Person> result = persons;
for (Filter filter : filters) {
result = filter.filter(result);
}
return result;
}
}
这样,我们就可以使用过滤器来过滤出符合不同条件的人了
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Tom", 20, "MALE"));
persons.add(new Person("Lucy", 19, "FEMALE"));
persons.add(new Person("John", 17, "MALE"));
persons.add(new Person("Lily", 21, "FEMALE"));
Filter maleFilter = new MaleFilter();
Filter femaleFilter = new FemaleFilter();
Filter ageFilter = new AgeFilter();
FilterChain maleAndAgeFilter = new FilterChain(Arrays.asList(maleFilter, ageFilter));
FilterChain femaleAndAgeFilter = new FilterChain(Arrays.asList(femaleFilter, ageFilter));
System.out.println("Male and age filter:");
maleAndAgeFilter.filter(persons).forEach(System.out::println);
//Person(name=Tom, age=20, gender=MALE)
//Person(name=Lily, age=21, gender=FEM
System.out.println("Female and age filter:");
femaleAndAgeFilter.filter(persons).forEach(System.out::println);
//Person(name=Lily, age=21, gender=FEMALE)
}
使用小结
滤器模式的核心是 Filter 接口,该接口包含了一个方法 filter(),用于对对象进行过滤。根据具体实现,filter() 方法可以接受一个对象作为参数,然后根据特定的标准判断该对象是否应该被过滤掉。过滤器模式在Java中可以应用于许多场景,例如:
-
Web开发中,对HTTP请求进行过滤,例如身份验证,日志记录等。
-
在Spring框架中,过滤器可以用于过滤请求并对请求进行预处理,例如对请求参数进行验证等。
-
Java 中的 Stream API 提供了丰富的过滤器方法,如 filter()、distinct()、map() 等
-
过滤器模式可以用于任何需要对数据进行过滤和处理的场景。
评论( 0 )