深入浅出过滤器模式

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

过滤器模式(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


相关文章
|
移动开发 API UED
【专栏:HTML进阶篇】HTML5拖放API与触摸事件
【4月更文挑战第30天】HTML5的拖放API和触摸事件增强了网页交互设计,使开发者能创建动态响应式界面。拖放API通过设定元素的`draggable`属性、监听拖动和放置事件以及处理`DataTransfer`对象实现。触摸事件如`touchstart`、`touchmove`、`touchend`则让触控设备操作更流畅。开发者需注意事件对象、多点触控处理和防止默认行为。结合两者,可创建图片排序、手势识别等交互功能,但也需面对浏览器兼容性和复杂逻辑挑战。利用HTML5这些工具,能提升用户体验,推动网页交互设计创新。
376 0
|
Ubuntu Linux 测试技术
【ZYNQ】简单几步,教你使用 Petalinux 定制 Linux
【ZYNQ】简单几步,教你使用 Petalinux 定制 Linux
1583 0
|
并行计算 异构计算
pip 国内安装gpu版pytorch
pytorch官网提供的方式下载太慢,可以配置全局镜像
|
4天前
|
云安全 监控 安全
|
2天前
|
存储 机器学习/深度学习 人工智能
打破硬件壁垒!煎饺App:强悍AI语音工具,为何是豆包AI手机平替?
直接上干货!3000 字以上长文,细节拉满,把核心功能、使用技巧和实测结论全给大家摆明白,读完你就知道这款 “安卓机通用 AI 语音工具"——煎饺App它为何能打破硬件壁垒?它接下来,咱们就深度拆解煎饺 App—— 先给大家扒清楚它的使用逻辑,附上“操作演示”和“🚀快速上手不踩坑 : 4 条核心操作干货(必看)”,跟着走零基础也能快速上手;后续再用真实实测数据,正面硬刚煎饺 App的语音助手口令效果——创建京东「牛奶自动下单神器」口令 ,从修改口令、识别准确率到场景实用性,逐一测试不掺水,最后,再和豆包 AI 手机语音助手的普通版——豆包App对比测试下,简单地谈谈煎饺App的能力边界在哪?
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1165 7
|
1天前
|
人工智能
自动化读取内容,不会写爆款的普通人也能产出好内容,附coze工作流
陌晨分享AI内容二创工作流,通过采集爆款文案、清洗文本、智能改写,实现高效批量生产。五步完成从选题到输出,助力内容创作者提升效率,适合多场景应用。
203 104
|
11天前
|
机器学习/深度学习 人工智能 数据可视化
1秒生图!6B参数如何“以小博大”生成超真实图像?
Z-Image是6B参数开源图像生成模型,仅需16GB显存即可生成媲美百亿级模型的超真实图像,支持中英双语文本渲染与智能编辑,登顶Hugging Face趋势榜,首日下载破50万。
735 42
|
15天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
1178 41