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

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

相关推荐
王ASC14 分钟前
SpringMVC的URL组成,以及URI中对/斜杠的处理,解决IllegalStateException: Ambiguous mapping
java·mvc·springboot·web
是小崔啊16 分钟前
开源轮子 - Apache Common
java·开源·apache
因我你好久不见20 分钟前
springboot java ffmpeg 视频压缩、提取视频帧图片、获取视频分辨率
java·spring boot·ffmpeg
程序员shen16161122 分钟前
抖音短视频saas矩阵源码系统开发所需掌握的技术
java·前端·数据库·python·算法
Ling_suu1 小时前
SpringBoot3——Web开发
java·服务器·前端
天使day1 小时前
SpringMVC
java·spring·java-ee
CodeClimb1 小时前
【华为OD-E卷-简单的自动曝光 100分(python、java、c++、js、c)】
java·python·华为od
liyinuo20172 小时前
嵌入式(单片机方向)面试题总结
嵌入式硬件·设计模式·面试·设计规范
风清云淡_A2 小时前
【java基础系列】实现数字的首位交换算法
java·算法
Gao_xu_sheng2 小时前
Java程序打包成exe,无Java环境也能运行
java·开发语言