Java设计模式 _结构型模式_过滤器模式

一、过滤器模式

1、过滤器模式
过滤器模式(Filter Pattern)是这一种结构型设计模式。过滤器,顾名思义,就是对一组数据进行过滤,从而最终获取到我们预期的数据。

2、实现思路
(1)、定义过滤器的规范接口(生明接口,定义统一的过滤方法)。
(2)、定义过滤器实现类,实现规范接口的过滤方法。
(3)、封装类中定义过滤器类的集合,添加过滤器到封装类中,定义和实现数据过滤的具体方法。

二、代码示例

// 定义基础员工类
@Data
@AllArgsConstructor
public class Employee {private String name;private int age;private String address;
}// 定义接口,设置过滤器统一方法
public interface BaseFilter {boolean filter(Employee data);
}
// 年龄过滤实现类
public class AgeBaseFilter implements BaseFilter {@Overridepublic boolean filter(Employee data) {if (data == null) {return false;}return data.getAge() > 30;}
}
// 地址过滤实现类
public class AddressBaseFilter implements BaseFilter {@Overridepublic boolean filter(Employee data) {if (data == null) {return false;}return data.getAddress().contains("北京");}
}// 封装过滤链类
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;public class EmployeeFilterUtil {private static List<BaseFilter> filters;public static void addFilter(BaseFilter filter) {     // 添加过滤器if (filters == null) {filters = new ArrayList<>();}filters.add(filter);}public static List<Employee> getFilterData(List<Employee> employeeList) {   // 过滤员工数据List<Employee> filterData = new ArrayList<>();if (!CollectionUtils.isEmpty(employeeList) && !CollectionUtils.isEmpty(filters)) {for (Employee employee : employeeList) {for (BaseFilter filter : filters) {if (!filter.filter(employee)) {employee = null;}}if (employee != null) {filterData.add(employee);}}} else {filterData = employeeList;}return filterData;}
}
// 测试
public static void main(String[] args) {List<Employee> employeeList = new ArrayList<>();Employee employee = new Employee("张三",29,"上海红桥区");employeeList.add(employee);employee = new Employee("张三1",30,"北京天安门");employeeList.add(employee);employee = new Employee("张三2",31,"北京天安门1");employeeList.add(employee);employee = new Employee("张三3",32,"上海红桥区1");employeeList.add(employee);employee = new Employee("张三4",33,"上海红桥区2");employeeList.add(employee);employee = new Employee("张三5",34,"北京天安门2");employeeList.add(employee);employee = new Employee("张三6",27,"1");employeeList.add(employee);// 添加过滤器EmployeeFilterUtil.addFilter(new AgeBaseFilter());EmployeeFilterUtil.addFilter(new AddressBaseFilter());// 使用过滤器链过滤数据List<Employee> filterData = EmployeeFilterUtil.getFilterData(employeeList);System.out.println("大于30岁的北京员工有:"+ JSON.toJSONString(filterData));}

运行接口:
在这里插入图片描述
说明:
运行结果可以看出实现了过滤效果。

总结:
过滤器模式是对一组数据进行过滤,从而达到我们希望数据的设计模式。首先需要定义统一过滤方法,之后就是根据需要编写各种实现类,对需要的场景搭配不同的过滤器链路,让数据经过这些过滤器链路后获取我们需要数据的过程。

学海无涯苦作舟!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/4492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

想要应聘前端工程师——学习路线指南

前端工程师学习路线 按照前端岗位需求,以优先学习工作更需要,面试更常考的内容为原则,由浅入深,层层铺垫,与时俱进,可以较容易地总结出前端学习路线图: HTML / CSS / JavaScript 基础学习 《Web 入门》 MDN 权威入门指南,HTML / CSS / JavaScript 快速上手 《CSS 世界…

华为OD机试 - 密码解密(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

emacs/tmux 常用快捷键

始于1983的 emacs 入门教程, 官方文档 插件大全, emacs china #源码安装 sudo apt-get install libgtk-3-dev libxpm-dev libtiff-dev libgnutls28-dev https://git.savannah.gnu.org/cgit/emacs.git/# sudo apt-add-repository -y ppa:adrozdoff/emacs sudo apt update sudo…

ChatGPT/GPT4 科研实战教程-包括论文写作、数据分析、科研绘图、PPT制作,程序开发

从2022年3月&#xff0c;OpenAI公司发布chatGPT3.5开始&#xff0c;以ChatGPT为代表的人工智能内容生成技术&#xff08;简称AIGC&#xff09;引起了广泛关注&#xff0c;我们进入了全民AI时代。 因此&#xff0c;我们需要了解和掌握AI思维&#xff0c;才能更好适应这个时代的…

什么是SQL 语句中相关子查询与非相关子查询

1.什么是SQL子查询 要理解相关子查询和非相关子查询&#xff0c;我们得首先理解什么是子查询&#xff0c;子查询是指在一个查询语句中嵌套的另一个查询语句。 子查询可以嵌套在其他查询语句中&#xff0c;如 SELECT、INSERT、UPDATE、DELETE 等&#xff0c;它作为一个独立的查…

uniapp微信小程序-分享

https://developers.weixin.qq.com/miniprogram/dev/component/button.html https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html#%E4%BD%BF%E7%94%A8%E6%8C%87%E5%BC%95 参考未整理 自定义参考未整理

使用Canal实现MySQL主从同步

说明&#xff1a;本文介绍如何使用Canal实现MySQL主从同步的效果&#xff0c;关于Canal入门使用参考&#xff1a;Canal入门使用 启动Canal 首先&#xff0c;设置Canal服务器里&#xff0c;目标节点&#xff08;即监测的MySQL节点&#xff09;的配置&#xff0c;启动Canal服务…

Scala 03 —— Scala OOP Extension

Scala 2.1 —— Scala OOP Extension 一、正则 文章目录 Scala 2.1 —— Scala OOP Extension一、正则1.1 Java正则和Scala正则的区别1.2 Java正则和Scala正则的的基本知识点Java正则Scala正则 1.3 练习练习一&#xff1a;使用正则表达式解析日志方法一&#xff1a;使用findAl…

心理学上有个概念叫:习惯性反驳(附上解决办法)

在心理学上&#xff0c;有一个词&#xff0c;叫做习惯性反驳。 什么意思呢&#xff1f; 就是不管你说什么&#xff0c;他都要反驳你&#xff0c;最后把你带入负面的情绪黑洞&#xff0c;搞得你非常崩溃。 一个总是习惯性反驳的人&#xff0c;其实是非常可怕的。 习惯性反驳的3个…

【LeetCode题库】1148. 文章浏览 I

文章目录 原题题解解题笔记——相关知识点拓展 我是一名立志把细节都说清楚的博主&#xff0c;欢迎【关注】&#x1f389; ~ 原创不易&#xff0c; 如果有帮助 &#xff0c;记得【点赞】【收藏】 哦~ ❥(^_-)~ 如有错误、疑惑&#xff0c;欢迎【评论】指正探讨&#xff0c;我…

与Apollo共创生态:Apollo7周年大会自动驾驶生态利剑出鞘

前言 4月22日&#xff0c;百度Apollo在北京车展前夕举办了以“破晓•拥抱智变时刻”为主题的智能汽车产品发布会&#xff0c;围绕汽车智能化&#xff0c;发布了智驾、智舱、智图等全新升级的“驾舱图”系列产品。 1、7周年大会 自2013年百度开始布局自动驾驶&#xff0c;201…

PotatoPie 4.0 实验教程(24) —— FPGA实现摄像头图像中心差分变换

为什么要对图像进行中心差分变换&#xff1f; 对图像进行中心差分变换的主要目的是计算图像中每个像素点的梯度。梯度在图像处理中是一个非常重要的概念&#xff0c;它可以用来描述图像中灰度变化的快慢和方向&#xff0c;常用于边缘检测、特征提取和图像增强等任务中。 具体…

对React-Fiber的理解,它解决了什么问题?

React V15 在渲染时&#xff0c;会递归比对 VirtualDOM 树&#xff0c;找出需要变动的节点&#xff0c;然后同步更新它们&#xff0c; 一气呵成。这个过程期间&#xff0c; React 会占据浏览器资源&#xff0c;这会导致用户触发的事件得不到响应&#xff0c;并且会导致掉帧&…

js试手练习

8.idaas.yundasys.com:10443/frontend/login#/login 搜索punlickKey&#xff0c;第二个 然后进加载器&#xff0c;全部折叠发现在fdd5全扣 注意的是输入账号时不会触发xhr要在登录那里打断点进入 9.m.ctyun.cn/wap/main/auth/login 搜索password: 往上找加载器&#xff0c;w…

windows服务启动提示‘服务没有响应控制功能’(mysql启动报错)

在安装mysql的时候&#xff0c;在windows服务项启动 或 使用命令net start mysql 时启动是报错&#xff0c;提示 服务没有响应控制功能 发生原因&#xff1a; Windows10 x64 或 更高的操作系统&#xff0c;有些系统缺少一些组件 解决办法&#xff1a; 1、下载最新的 Microsoft …

clickhouse安装部署

虚拟机&#xff1a;virtualbox7.0 操作系统&#xff1a;ubuntu server 22.04.3 虚拟机硬件&#xff1a;cpu 1&#xff0c;内存 2G&#xff0c; 硬盘 100G 采用默认安装 参照 https://clickhouse.com/docs/en/install#quick-install 安装部署 对于Debian、Ubuntu&#xff0c…

版本比对sql

弹窗 index <template><el-dialogtitle"版本":visible.sync"dialogVisible"width"55%"center:close-on-click-modal"false":close-on-press-escape"false":before-close"beforeClose"open"open&q…

【Linux网络】DHCP原理与配置

目录 一、DHCP工作原理 1.了解DHCP服务 2.使用DHCP的好处 3.DHCP的分配方式 二、DHCP的租约过程 三、DHCP场景应用实验 一、DHCP工作原理 1.了解DHCP服务 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; 由Internet工作…

[Unity]打包Android后xxx方法丢失。

记录一个坑&#xff1a; Editor下C#一段反射代码运行正常&#xff0c;但是打包后报错。最后发现是PlayerSettings里的Managed Stripping Level&#xff08;托管堆代码剥离级别&#xff09;导致的&#xff0c;项目默认的是Medium。改成Low确实好使&#xff0c;但是会造成包体大…

Redis(四) 主从、哨兵、集群环境搭建

结合前三期 Redis(一) Redis简介(Redis(一) Redis简介-CSDN博客) Redis(二) 可编程性(Redis(二) 可编程性-CSDN博客) Redis(三) 事务与发布订阅(Redis(三) 事务与发布订阅-CSDN博客) 目录 1.0 Redis主从 1.1 Redis 主从结构的基本原理和工作方式 1.2 Redis 主从结构的好处 …