过滤器模式(Filter Pattern)是一种常用的设计模式,它用于通过一系列条件来过滤对象集合,并将满足条件的对象保留下来。该模式可以帮助我们在不修改原始对象集合的情况下,根据特定的条件对集合进行筛选和处理。
在过滤器模式中,通常有三个核心角色:
-
过滤器接口(Filter):定义了过滤器的基本操作,通常包括一个过滤方法,用于判断对象是否满足条件。
-
具体过滤器(Concrete Filter):实现了过滤器接口,根据特定的条件对对象进行过滤。
-
过滤器管理器(Filter Manager):负责管理和应用过滤器,它维护一个过滤器链,并提供方法来添加、移除和执行过滤器。
下面是一个示例,展示了如何使用过滤器模式来过滤一组学生对象:
// 1. 过滤器接口
interface Filter {boolean matches(Student student);
}// 2. 具体过滤器实现
class AgeFilter implements Filter {private int age;public AgeFilter(int age) {this.age = age;}@Overridepublic boolean matches(Student student) {return student.getAge() == age;}
}class GradeFilter implements Filter {private String grade;public GradeFilter(String grade) {this.grade = grade;}@Overridepublic boolean matches(Student student) {return student.getGrade().equals(grade);}
}// 3. 过滤器管理器
class FilterManager {private List<Filter> filters;public FilterManager() {this.filters = new ArrayList<>();}public void addFilter(Filter filter) {filters.add(filter);}public void removeFilter(Filter filter) {filters.remove(filter);}public List<Student> applyFilters(List<Student> students) {List<Student> filteredStudents = new ArrayList<>();for (Student student : students) {boolean matchesAllFilters = true;for (Filter filter : filters) {if (!filter.matches(student)) {matchesAllFilters = false;break;}}if (matchesAllFilters) {filteredStudents.add(student);}}return filteredStudents;}
}// 学生类
class Student {private String name;private int age;private String grade;public Student(String name, int age, String grade) {this.name = name;this.age = age;this.grade = grade;}public String getName() {return name;}public int getAge() {return age;}public String getGrade() {return grade;}
}// 使用示例
public class Main {public static void main(String[] args) {List<Student> students = new ArrayList<>();students.add(new Student("Alice", 18, "A"));students.add(new Student("Bob", 20, "B"));students.add(new Student("Charlie", 18, "A"));FilterManager filterManager = new FilterManager();filterManager.addFilter(new AgeFilter(18));filterManager.addFilter(new GradeFilter("A"));List<Student> filteredStudents = filterManager.applyFilters(students);for (Student student : filteredStudents) {System.out.println("Name: " + student.getName() + ", Age: " + student.getAge() + ", Grade: " + student.getGrade());}}
}
在上面的示例中,我们定义了两个具体的过滤器实现:AgeFilter
(按年龄过滤)和GradeFilter
(按成绩过滤)。然后,我们使用FilterManager
来管理这些过滤器,并将它们应用于学生对象集合。最后,我们打印出满足所有过滤条件的学生信息。
通过使用过滤器模式,我们可以轻松地添加、移除和组合不同的过滤器,以满足特定的过滤需求,同时保持代码的可扩展性和可维护性。