Java设计模式之过滤器模式(Filter Pattern)

过滤器模式(Filter Pattern)是一种常用的设计模式,它用于通过一系列条件来过滤对象集合,并将满足条件的对象保留下来。该模式可以帮助我们在不修改原始对象集合的情况下,根据特定的条件对集合进行筛选和处理。

在过滤器模式中,通常有三个核心角色:

  1. 过滤器接口(Filter):定义了过滤器的基本操作,通常包括一个过滤方法,用于判断对象是否满足条件。

  2. 具体过滤器(Concrete Filter):实现了过滤器接口,根据特定的条件对对象进行过滤。

  3. 过滤器管理器(Filter Manager):负责管理和应用过滤器,它维护一个过滤器链,并提供方法来添加、移除和执行过滤器。

下面是一个示例,展示了如何使用过滤器模式来过滤一组学生对象:

java 复制代码
// 1. 过滤器接口
interface Filter {
    boolean matches(Student student);
}

// 2. 具体过滤器实现
class AgeFilter implements Filter {
    private int age;

    public AgeFilter(int age) {
        this.age = age;
    }

    @Override
    public boolean matches(Student student) {
        return student.getAge() == age;
    }
}

class GradeFilter implements Filter {
    private String grade;

    public GradeFilter(String grade) {
        this.grade = grade;
    }

    @Override
    public 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来管理这些过滤器,并将它们应用于学生对象集合。最后,我们打印出满足所有过滤条件的学生信息。

通过使用过滤器模式,我们可以轻松地添加、移除和组合不同的过滤器,以满足特定的过滤需求,同时保持代码的可扩展性和可维护性。

相关推荐
花间相见5 分钟前
【Java基础面试题】—— 核心知识点面试题(含答案):语法+集合+JVM+设计模式+算法
java·jvm·设计模式
会飞De琥珀11 分钟前
java工具类,字符串转时间
java·开发语言
曹牧33 分钟前
JSON 数组的正确使用方式
java·服务器·前端
LINgZone234 分钟前
深入解析:Cglib与JDK动态代理的实现原理、区别及性能对比
java·开发语言
华科易迅41 分钟前
Spring JDBC
java·后端·spring
云烟成雨TD1 小时前
Spring AI 1.x 系列【17】函数型工具开发与使用
java·人工智能·spring
云烟成雨TD1 小时前
Spring AI 1.x 系列【15】AI Agent 基石:Tool Calling 标准与 Spring AI 集成
java·人工智能·spring
咸鱼2.01 小时前
【java入门到放弃】杂记
java·开发语言
亦暖筑序2 小时前
《Spring AI 实战系列 入门篇》第 3 篇
java
Memory_荒年2 小时前
Netty:从“网络搬砖”到“流水线大师”的奇幻之旅
java·后端