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

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

相关推荐
ChinaRainbowSea14 分钟前
1. 初始 RabbitMQ 消息队列
java·中间件·rabbitmq·java-rabbitmq
lmryBC4924 分钟前
golang接口-interface
java·前端·golang
ゞ 正在缓冲99%…24 分钟前
leetcode75.颜色分类
java·数据结构·算法·排序
橘猫云计算机设计37 分钟前
基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·考研·django·毕业设计
时光呢41 分钟前
JAVA常见的 JVM 参数及其典型默认值
java·开发语言·jvm
程序媛学姐1 小时前
SpringKafka错误处理:重试机制与死信队列
java·开发语言·spring·kafka
向阳2561 小时前
SpringBoot+vue前后端分离整合sa-token(无cookie登录态 & 详细的登录流程)
java·vue.js·spring boot·后端·sa-token·springboot·登录流程
XiaoLeisj1 小时前
【MyBatis】深入解析 MyBatis XML 开发:增删改查操作和方法命名规范、@Param 重命名参数、XML 返回自增主键方法
xml·java·数据库·spring boot·sql·intellij-idea·mybatis
风象南1 小时前
SpringBoot实现数据库读写分离的3种方案
java·spring boot·后端
振鹏Dong2 小时前
策略模式——本质是通过Context类来作为中心控制单元,对不同的策略进行调度分配。
java·策略模式