设计模式之过滤器模式FilterPattern(十)

一、过滤器模式

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

二、组件介绍

1、过滤器接口(Filter)
定义了过滤器的基本方法,具体的实现还要具体过滤器角色去参与,在实际应用中可以扩展该接口以适应不同的过滤条件
2 具体命过滤器(ConcreteFilter)
实现了过滤器接口,负责执行具体的过滤操作。对数据进行过滤
3 过滤链(FilterChain)
将多个过滤器按照一定的顺序组合起来,形成一个过滤器链,依次对数据进行过滤

三、代码实战

1、Person

package com.xu.demo.filterPattern;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 数据实体类*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {private String name;//姓名private String sex;  // M表示男性,F表示女性private Integer age;//年龄}

 2、IFilter

package com.xu.demo.filterPattern;import java.util.List;/*** 过滤器接口*/
public interface IFilter {/*** 过滤操作* @param personList* @return*/List<Person> filterOperate(List<Person> personList);}

 3、NameFilter

package com.xu.demo.filterPattern;import java.util.List;/*** 过滤出性别为男的同学*/
public class NameFilter implements IFilter {@Overridepublic List<Person> filterOperate(List<Person> personList) {return personList.stream().filter(person ->person.getName().startsWith("J")).toList();}
}

 4、AgeFilter

package com.xu.demo.filterPattern;import java.util.List;/*** 过滤已满足18岁的同学*/
public class AgeFilter implements IFilter {@Overridepublic List<Person> filterOperate(List<Person> personList) {return personList.stream().filter(person ->person.getAge() > 25).toList();}
}

 5、SexFilter

 

package com.xu.demo.filterPattern;import java.util.List;/*** 过滤已满足18岁的同学*/
public class SexFilter implements IFilter {@Overridepublic List<Person> filterOperate(List<Person> personList) {return personList.stream().filter(person ->"M".equals(person.getSex())).toList();}
}

6、FilterChain

package com.xu.demo.filterPattern;import org.apache.commons.collections.CollectionUtils;
import java.util.ArrayList;
import java.util.List;public class FilterChain {private List<IFilter> filters;public FilterChain(List<IFilter> filters) {this.filters = filters;}public List<Person> doFilter(List<Person> personList) {if (CollectionUtils.isEmpty(filters) || CollectionUtils.isEmpty(personList)) {return new ArrayList<>();}List<Person> afterFilterShapes = new ArrayList<>(personList);// 执行过滤for (IFilter filter : filters) {afterFilterShapes = filter.filterOperate(afterFilterShapes);}return afterFilterShapes;}
}

7、FilterPattern

package com.xu.demo.filterPattern;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class FilterPattern {public static void main(String[] args) {//待过滤的数据List<Person> peoples = new ArrayList<>();peoples.add(new Person("Jenny", "F", 20));peoples.add(new Person("John", "M", 30));peoples.add(new Person("Jack", "M", 35));peoples.add(new Person("Mark", "M", 30));peoples.add(new Person("Ronnie", "M", 25));peoples.add(new Person("Ding", "M", 25));peoples.add(new Person("Janet", "F", 35));peoples.add(new Person("Jessie", "F", 25));//过滤器IFilter nameFilter = new NameFilter();IFilter ageFilter = new AgeFilter();IFilter sexFilter = new SexFilter();//过滤链FilterChain filter1 = new FilterChain(Arrays.asList(nameFilter, ageFilter));FilterChain filter2 = new FilterChain(Arrays.asList(ageFilter, sexFilter));FilterChain filter3 = new FilterChain(Arrays.asList(nameFilter, sexFilter));//过滤链过滤出数据List<Person> filteredPeople1 = filter1.doFilter(peoples);List<Person> filteredPeople2 = filter2.doFilter(peoples);List<Person> filteredPeople3 = filter3.doFilter(peoples);System.out.println("================名字以J开头和年龄大于25岁==================");filteredPeople1.forEach(System.out::println);System.out.println("================年龄大于25岁和性别是M男性==================");filteredPeople2.forEach(System.out::println);System.out.println("================名字以J开头和性别是M男性===================");filteredPeople3.forEach(System.out::println);}}

 运行结果:

 至此,整个过滤器模式就基本实现了,注意体会代码之间的关系,我们下回再见。

 

 

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

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

相关文章

【Kotlin 三】封装/继承/多态 属性覆盖 类的扩展

1.封装/继承/多态 1.1 封装 一般&#xff0c;我们将类的属性都声明为private&#xff0c;在类中通过暴露一部分public的方法来供外部读写对象属性 class Student (private var name: String) {fun getName(): String {return name}fun setName(name: String) {this.name na…

【长亭雷池WAF——“动态防护”功能深度体验】

前言&#xff1a; 在当今的网络安全环境中&#xff0c;Web应用防火墙&#xff08;WAF&#xff09;扮演着至关重要的角色。它们不仅能够防御常见的Web攻击&#xff0c;如SQL注入、跨站脚本攻击&#xff08;XSS&#xff09;等&#xff0c;还能够应对日益复杂的网络威胁。 长亭…

如何通过 6 种简单方法将照片从华为转移到 PC?

华为作为全球领先的智能手机供应商之一&#xff0c;最近推出了其自主研发的操作系统——HarmonyOS 2.0&#xff0c;旨在为智能手机、平板电脑和智能手表等设备提供更流畅的用户体验。随着Mate 40/P40等系列手机计划升级到HarmonyOS 2.0&#xff0c;用户可能需要将手机中的文件备…

CAM350如何快速删除Gerber文件上的东西?

文章目录 CAM350如何快速删除Gerber文件上的东西?CAM350如何快速保存已经修改的Gerber文件? CAM350如何快速删除Gerber文件上的东西? CAM如何导入Gerber文件见此篇 今天遇上了一个删除Gerber文件上部分字母的任务&#xff0c;CAM350只能一点点删除线的操作把我手指头差点按…

订单排队与链动模式塑造社交电商新格局

在数字化浪潮中&#xff0c;社交电商凭借其独特的魅力与潜力&#xff0c;正逐渐崭露头角。本文将解读一种融合了订单排队与链动模式的创新商业模式。这一模式旨在通过提高消费者复购率&#xff0c;优化销售流程&#xff0c;从而推动销售增长&#xff0c;塑造社交电商新生态。 …

Mybatis03-ResultMap及分页

1、属性名和字段名不一致问题 1.问题 数据库中的字段 新建一个项目Mybatis-04&#xff0c;拷贝之前&#xff0c;测试实体类字段不一致的情况 public class User {private int id;private String name;private String password; }select * from mybatis.user where id #{id} …

2024年宜昌中级工程师职称如何申报呢?

今年宜昌中级职称如何报名&#xff1f;怎么申报&#xff1f;申报时间是什么时候呢&#xff1f;报名条件是什么呢&#xff1f; 一、2024年宜昌中级职称申报条件&#xff1a;1.社保条件&#xff1a;在宜昌本地注册登记6个月以上民营企业&#xff0c;专业技术岗位从事工程技术工作…

苍穹外卖笔记-02-借助小乌龟创建gitee仓库,apifox代替YApi,Swagger

TOC 1 借助小乌龟创建gitee苍穹外卖仓库 这里建议看视频bilibili比特鹏哥视频 使用软件 git TortoiseGit https://git-scm.com/downloads https://tortoisegit.org/ 使用代码托管平台gitee&#xff0c;git的使用和gitee的账号创建需要查询其他资料 在一个从未克隆仓库的…

3389远程桌面,如何进行3389远程桌面的连接操作

随着信息技术的快速发展&#xff0c;远程桌面连接技术逐渐成为企业、教育以及个人用户进行远程办公、技术支持以及协作交流的重要工具。其中&#xff0c;3389远程桌面因其稳定性和易用性而备受青睐。本文将从专业角度出发&#xff0c;为您详细介绍如何进行3389远程桌面的连接操…

【名词解释】Unity中的Text组件及其使用示例

Unity中的Text组件是一个UI组件&#xff0c;它用于在游戏或应用程序中显示文本。Text组件可以显示静态文本&#xff0c;也可以动态地显示变量的值&#xff0c;如分数、时间、玩家名字等。Text组件是UI系统的一部分&#xff0c;通常与Canvas&#xff08;画布&#xff09;组件一起…

大模型产品的选择:独特优势与个人倾向

层出不穷的大模型产品&#xff0c;你怎么选&#xff1f; 随着近日腾讯元宝APP的正式上线&#xff0c;国内大模型产品又添一员。关于接连出现的“全能“大模型AIGC产品&#xff0c;你都用过哪些呢&#xff1f;不妨来分享一下你的使用体验吧&#xff01;在这些大模型产品中&…

【React篇 】React项目中常用的工具库

我们可以从项目初始化、开发、构建、检查及发布的顺序总结react项目开发常用的工具库。 首先是初始化。 初始化工程项目一般用官方维护的 create-react-app&#xff0c;这个工具使用起来简单便捷&#xff0c;但 create-react-app 的配置隐藏比较深&#xff0c;修改配置时搭配…

LC 26删除有序数组中的重复项

去重题&#xff0c;双指针&#xff0c;&#xff0c;因为题干说原地删除&#xff0c;且nums其余元素不重要。一个cur记录当前不重复的数应该插在第几位了&#xff0c;for循环里的i相当于是第二个指针&#xff08;右指针&#xff09;&#xff0c;遍历数组来找不重复的元素 class …

25-ARM-V7架构

运行模式 User&#xff08;USR&#xff09;&#xff1a;用户模式 linux系统用户进程&#xff0c;资源访问受限System&#xff08;SYS&#xff09;&#xff1a;系统模式 linux内核&#xff0c;共用寄存器&#xff0c;资源自由访问IRQ&#xff1a;一般中断模式 硬件产生中断信号…

数据结构:模拟队列

数据结构&#xff1a;模拟队列 题目描述参考代码 题目描述 输入样例 10 push 6 empty query pop empty push 3 push 4 pop query push 6输出样例 NO 6 YES 4参考代码 #include <iostream>using namespace std;const int N 100010;int q[N], hh, tt;int m, x; string …

【代码随想录算法训练Day29】LeetCode 491.非递减子序列、LeetCode 46.全排列、LeetCode 47.全排列II

Day29 回溯第五天 LeetCode 491.非递减子序列 这道题比起子集II来说又多了要考虑的点&#xff0c;首先我们不能排序来去重了&#xff0c;因为这样会增加很多不合题意的递增序列。所以我们使用set来去重。同时还要注意题目对答案子集要求内部元素的数量要大于1。 这个代码有一…

二分搜索树深度优先遍历

二分搜索树深度优先遍历 二分搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;是一种特殊的二叉树&#xff0c;它具有以下特性&#xff1a;对于树中的任意节点&#xff0c;其左子树中的所有元素都小于该节点的值&#xff0c;其右子树中的所有元素都大于该…

`combineLatest` 和 `zip` 都是 RxJava 中用来组合多个流的操作符,但它们在行为和使用场景上有一些显著的区别。

combineLatest 和 zip 都是 RxJava 中用来组合多个流的操作符&#xff0c;但它们在行为和使用场景上有一些显著的区别。 combineLatest combineLatest 操作符会在每个源 Flowable 发出一项数据后&#xff0c;合并最新发出的数据项&#xff0c;并且每当任意一个源 Flowable 发…

C++STL---list知识汇总

前言 学习完list&#xff0c;我们会对STL中的迭代器有进一步的认识。list底层有很多经典的东西&#xff0c;尤其是他的迭代器。而list的结构是一个带头双向循环链表。 list没有reserve和resize&#xff0c;因为它底层不是连续的空间&#xff0c;它是用时随时申请&#xff0c;…

windows 系统中部署 windows_exporter

从 github 中下载安装包到本地路径&#xff1a; Releases prometheus-community/windows_exporter (github.com) 后台运行方式windows_exporter&#xff0c;进入命令提示符执行以下命令&#xff1a; > powershell -Command "Start-Process D:\windows_exporter\wind…