深入浅出过滤器模式

简介: 深入浅出过滤器模式

过滤器模式(Filter Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

过滤器模式中几个常见的角色:

  1. AbstractFilter(抽象过滤器角色):在客户端可以调用它的方法,在抽象过滤器角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的实现类去,传递给相应的实现类对象处理。
  2. ConcreteFilter(具体滤器角色):在客户端可以调用它的方法,在具体滤器角色会对目标对象集合进行逻辑过滤,最后再返回一个过滤后的集合。
  3. Subject(被过滤角色):在软件系统中可以有一个或者多个目标角色,在具体过滤器中会对目标角色进行逻辑处理以查看是否是我想要的。
    网络异常,图片无法展示
    |


代码实现

Student.java

/**
 * @desc: Student实体类(被过滤器角色)
 * @author: YanMingXin
 * @create: 2021/8/11-17:53
 **/
public class Student {
    private Integer id;
    private String name;
    private Integer age;
    private String degree;
    private Integer score;
    private String scoreString;
    ......(构造方法、Getter方法、Setter方法、toString方法)
}
复制代码

StudentFilter.java

/**
 * @desc: Filter接口(抽象过滤器角色)
 * @author: YanMingXin
 * @create: 2021/8/11-17:56
 **/
public interface StudentFilter {
    /**
     * 拦截Student实体
     *
     * @param student
     * @return
     */
    Student doFilter(Student student);
    /**
     * 拦截Student集合
     *
     * @param students
     * @return
     */
    List<Student> doListFilter(List<Student> students);
}
复制代码


ScoreFilter.java

/**
 * @desc: 分数过滤器类(具体过滤器角色)
 * @author: YanMingXin
 * @create: 2021/8/11-17:58
 **/
public class ScoreFilter implements StudentFilter {
    private final String SCORE_A = "A";
    private final String SCORE_B = "B";
    private final String SCORE_C = "C";
    private final int SCORE_A_VALUE = 100;
    private final int SCORE_B_VALUE = 80;
    private final int SCORE_C_VALUE = 60;
    @Override
    public Student doFilter(Student student) {
        int score = student.getScore();
        if (score >= SCORE_B_VALUE && score <= SCORE_A_VALUE) {
            student.setScoreString(SCORE_A);
        } else if (score < SCORE_B_VALUE && score >= SCORE_C_VALUE) {
            student.setScoreString(SCORE_B);
        } else if (score < SCORE_C_VALUE) {
            student.setScoreString(SCORE_C);
        }
        return student;
    }
    @Override
    public List<Student> doListFilter(List<Student> students) {
        ArrayList<Student> list = new ArrayList<>();
        for (Student student : students) {
            int score = student.getScore();
            if (score >= SCORE_B_VALUE && score <= SCORE_A_VALUE) {
                student.setScoreString(SCORE_A);
            } else if (score < SCORE_B_VALUE && score >= SCORE_C_VALUE) {
                student.setScoreString(SCORE_B);
            } else if (score < SCORE_C_VALUE) {
                student.setScoreString(SCORE_C);
            }
            list.add(student);
        }
        return list;
    }
}
复制代码


DegreeFilter.java

/**
 * @desc: 年级过滤器类(具体过滤器角色)
 * @author: YanMingXin
 * @create: 2021/8/11-17:57
 **/
public class DegreeFilter implements StudentFilter {
    private final String HIGH_DEGREE = "高年级";
    private final String LOW_DEGREE = "低年级";
    private final Integer AVG_AGE = 14;
    /**
     * 实现单个学生的过滤方法
     *
     * @param student
     * @return
     */
    @Override
    public Student doFilter(Student student) {
        if (student.getAge() >= AVG_AGE) {
            student.setDegree(HIGH_DEGREE);
        } else {
            student.setDegree(LOW_DEGREE);
        }
        return student;
    }
    /**
     * 实现学生集合的过滤方法
     *
     * @param students
     * @return
     */
    @Override
    public List<Student> doListFilter(List<Student> students) {
        ArrayList<Student> list = new ArrayList<>();
        for (Student student : students) {
            if (student.getAge() >= AVG_AGE) {
                student.setDegree(HIGH_DEGREE);
            } else {
                student.setDegree(LOW_DEGREE);
            }
            list.add(student);
        }
        return list;
    }
}
复制代码


测试:

/**
 * @desc: 过滤器模式
 * @author: YanMingXin
 * @create: 2021/8/11-17:51
 **/
public class MyFilterTest {
    public static void main(String[] args) {
        List<Student> students = Arrays.asList(
                new Student(1, "zs", 13, null, 78, null),
                new Student(2, "ls", 18, null, 97, null),
                new Student(3, "ww", 13, null, 51, null),
                new Student(4, "zl", 12, null, 45, null),
                new Student(5, "mq", 10, null, 84, null)
        );
        DegreeFilter degreeFilter = new DegreeFilter();
        ScoreFilter scoreFilter = new ScoreFilter();
        List<Student> students1 = degreeFilter.doListFilter(students);
        System.out.println("第一次过滤:");
        System.out.println(students1);
        List<Student> students2 = scoreFilter.doListFilter(students);
        System.out.println("第二次过滤:");
        System.out.println(students2);
    }
}
复制代码


输出:

第一次过滤:
[Student{id=1, name='zs', age=13, degree='低年级', score='78', scoreString='null'}, Student{id=2, name='ls', age=18, degree='高年级', score='97', scoreString='null'}, Student{id=3, name='ww', age=13, degree='低年级', score='51', scoreString='null'}, Student{id=4, name='zl', age=12, degree='低年级', score='45', scoreString='null'}, Student{id=5, name='mq', age=10, degree='低年级', score='84', scoreString='null'}]
第二次过滤:
[Student{id=1, name='zs', age=13, degree='低年级', score='78', scoreString='B'}, Student{id=2, name='ls', age=18, degree='高年级', score='97', scoreString='A'}, Student{id=3, name='ww', age=13, degree='低年级', score='51', scoreString='C'}, Student{id=4, name='zl', age=12, degree='低年级', score='45', scoreString='C'}, Student{id=5, name='mq', age=10, degree='低年级', score='84', scoreString='A'}]
复制代码


参考:

https://blog.csdn.net/weixx3/article/details/80233991

https://www.runoob.com/design-pattern/filter-pattern.html


相关文章
|
网络协议
使用MPLS LDP解决BGP路由黑洞的问题
MPLS LDP默认不为BGP路由分配标签
|
算法 安全 网络协议
ssh工作流程及其原理——ssh免密登录
ssh工作流程及其原理——ssh免密登录
517 0
|
数据挖掘
R语言法国足球联赛球员多重对应分析(MCA)
R语言法国足球联赛球员多重对应分析(MCA)
|
存储 安全 前端开发
【精通内核】计算机内存地址原理深度解析
内存在程序、Linux已经计算机中占有重要地位,本文深度解析计算机内存地址的原理,通过编译时的内存原理,深入浅出逐步讲解物理地址、虚拟内存、分段分页原理、线性地址,以及intel 对内存操作和原理解析。
|
数据安全/隐私保护 iOS开发 开发者
iOS开发证书申请教程(udid真机调试测试)
iOS开发证书申请教程(udid真机调试测试)
iOS开发证书申请教程(udid真机调试测试)
|
IDE JavaScript 前端开发
2022 年 9 个最佳 JavaScript IDE 和代码编辑器
作为WEB的核心语言之一,如果没有 JavaScript,互联网将完全不同。JavaScript 是一种用于前端和后端 Web 开发的高级编程语言。可以使用 JavaScript 来创建动态 Web 内容和应用程序。
2938 0
2022 年 9 个最佳 JavaScript IDE 和代码编辑器
|
7天前
|
人工智能 运维 安全
|
5天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
607 21