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

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

相关推荐
JH30736 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
Coder_Boy_8 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble8 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟8 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖8 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_12498707539 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_10 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.10 小时前
Day06——权限认证-项目集成
java
瑶山10 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy10 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法