掌握高级设计原则:Java中的过滤器模式解析与实战演练,构建灵活且可扩展的系统架构

过滤器模式是一种结构型设计模式,它允许开发者使用不同的标准来过滤一组对象,并通过逻辑运算以解耦的方式将它们联系起来。

过滤器模式的核心在于提供了一个处理对象的机制,这个机制可以根据一个或多个标准来决定哪些对象应该被接受、哪些应该被排除。这种模式通常用于实现复杂的数据筛选和处理逻辑,尤其是在需要将数据处理过程分解为多个独立步骤时。以下是过滤器模式的一些关键点:

  1. 角色定义:在过滤器模式中,通常会有一个抽象过滤器角色(AbstractFilter),它负责定义过滤器的实现接口。具体的实现则由具体过滤器角色(Concrete Filter)来完成,它们实现了抽象过滤器定义的接口,并提供具体的过滤逻辑。
  2. 链式结构:过滤器模式通常以链式结构来实现,这意味着一个过滤器处理完数据后,可以将处理结果传递给下一个过滤器。这种链式结构使得每个过滤器都只需要关注自己的职责,而不必知道其他过滤器的具体实现。
  3. 应用场景:过滤器模式适用于需要对数据进行多步骤处理的情况,例如网络请求的处理、数据库查询的结果筛选等。通过使用过滤器模式,可以灵活地添加或移除处理步骤,而不影响其他部分的代码。
    一个简单的过滤器模式如图所示:
    在这里插入图片描述

过滤器模式允许动态地组合多个过滤条件,以便从一组对象中选择出满足特定标准的对象集合。通过将不同的过滤器加入到 AndCriteria 中,可以灵活地控制筛选结果。

代码示例

下面是一个简单的Java过滤器模式实现的例子,我们定义了Person类、Criteria接口以及两个具体的过滤器:AgeCriteria和NameCriteria,还有一个复合过滤器AndCriteria,它允许我们将多个过滤器逻辑串联起来使用。在主函数中,我们创建了一个人员列表并对之应用了复合过滤条件来获取特定年龄段且名字包含特定字符串的人。:
定义一个Person实体类:

public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}// 省略getter和setter方法
}

定义过滤器接口:

public interface Criteria {public List<Person> meetCriteria(List<Person> persons);
}

实现年龄过滤器:

public class AgeCriteria implements Criteria {private int minAge;private int maxAge;public AgeCriteria(int minAge, int maxAge) {this.minAge = minAge;this.maxAge = maxAge;}@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> filteredPersons = new ArrayList<>();for (Person person : persons) {if (person.getAge() >= minAge && person.getAge() <= maxAge) {filteredPersons.add(person);}}return filteredPersons;}
}

实现名称过滤器:

// 实现名称过滤器
public class NameCriteria implements Criteria {private String nameSubstring;public NameCriteria(String nameSubstring) {this.nameSubstring = nameSubstring;}@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> filteredPersons = new ArrayList<>();for (Person person : persons) {if (person.getName().contains(nameSubstring)) {filteredPersons.add(person);}}return filteredPersons;}
}

定义组合过滤器,可以添加多个Criteria进行复合过滤:

public class AndCriteria implements Criteria {private Criteria criteria1;private Criteria criteria2;public AndCriteria(Criteria criteria1, Criteria criteria2) {this.criteria1 = criteria1;this.criteria2 = criteria2;}@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> intermediateResult = criteria1.meetCriteria(persons);return criteria2.meetCriteria(intermediateResult);}
}

使用示例:

public class FilterPatternDemo {public static void main(String[] args) {List<Person> people = Arrays.asList(new Person("Alice", 25),new Person("Bob", 30),new Person("Charlie", 35),new Person("David", 40));Criteria ageCriteria = new AgeCriteria(28, 36);Criteria nameCriteria = new NameCriteria("arlie"); // 包含"arlie"的名字Criteria combinedCriteria = new AndCriteria(ageCriteria, nameCriteria);List<Person> filteredPeople = combinedCriteria.meetCriteria(people);for (Person person : filteredPeople) {System.out.println(person.getName());}}
}

过滤器模式的优点

  1. 提高代码的灵活性和可维护性:过滤器模式通过提供一个灵活的处理和筛选对象集合的方法,使得在不改变代码结构的前提下,可以很方便地增加新的过滤标准或者修改现有的过滤逻辑。
  2. 高内聚低耦合:该模式允许多个过滤器以松耦合的方式组合在一起,每个过滤器负责一个具体的过滤条件,这样可以独立地改变和复用各个过滤器。
  3. 多过滤器简单合成:多个过滤器可以简单地合成一个新的过滤器,从而实现更复杂的过滤逻辑。
  4. 功能模块重用:由于每个过滤器都是独立的,它们可以在其他场景中被重用,这提高了系统的模块性。

过滤器模式的缺点

  1. 性能下降:由于每个过滤器都需要对每个元素进行处理,如果有多个元素和多个过滤器,这将导致性能问题,复杂度为O(mn),其中n是元素数量,m是过滤器数量。
  2. 实现复杂:在实现过滤器模式时,可能需要处理一些复杂的逻辑,以确保过滤器之间能够正确地协同工作。
  3. 需协调数据流:在多个过滤器之间传递数据可能会使数据流的控制变得更加复杂。

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

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

相关文章

解析KafkaConsumer类的神奇之道

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 解析KafkaConsumer类的神奇之道 前言KafkaConsumer双线程设计主线程&#xff08;消费线程&#xff09;&#xff1a;心跳线程&#xff1a;示例代码&#xff1a; KafkaConsumer线程不安全线程安全的替代…

jetson nano——编译一些包的网址导航,pyside2,qt(持续更新)

目录 1.PySide2下载地址2.tesserocr下载地址3.Qt下载地址4.OpenSSL官网5.latex编译器下载地址5.1MikTex5.2TeX Live 1.PySide2下载地址 https://download.qt.io/official_releases/QtForPython/pyside2/ 如下图&#xff1a; 2.tesserocr下载地址 https://github.com/simonflue…

JavaWeb-CSS

一、CSS简介 CSS 是一门语言&#xff0c;用于控制网页表现 CSS(Cascading Style Sheet):层叠样式表 W3C标准&#xff1a;网页主要由三部分组成 结构&#xff1a;HTML 表现&#xff1a;CSS 行为&#xff1a;JavaScript 二、CSS导入方式 CSS导入HTML有三种方式&#xff1…

PTA冰岛人

作者 陈越 单位 浙江大学 2018年世界杯&#xff0c;冰岛队因1:1平了强大的阿根廷队而一战成名。好事者发现冰岛人的名字后面似乎都有个“松”&#xff08;son&#xff09;&#xff0c;于是有网友科普如下&#xff1a; 冰岛人沿用的是维京人古老的父系姓制&#xff0c;孩子的姓…

行业突破!四信实现低延时摄像头弱网状态100ms以内实时传输

随着人工智能、大数据、区块链等技术在城市中快速发展&#xff0c;人们日常生活中已经离不开网络的支撑&#xff0c;而实现“人与人”、“人与物”及“物与物”之间高速连接应用的“时延”&#xff0c;是网络支撑中最重要的存在。 以城市生活例子为例&#xff0c;当网络延时出现…

week07day02(powerbi)

一. 透视列 1. 选择一列&#xff0c;然后再转换中选择透视列&#xff0c;被选择的这一列就会变成 列名 2. 只能选择一列&#xff0c;不能同时选择多列 3. 透视表是二维表&#xff0c;数值匹配不上会用 null值 替代。 4. 透视列中存在高级选项&#xff0c;根据所需选择相应功…

通过日志恢复sql server数据库

在SQL Server中&#xff0c;通过日志恢复数据库是一个精细的过程&#xff0c;主要用于在数据库出现错误、数据丢失或需要回滚到特定时间点时恢复数据。以下是一般步骤概述&#xff1a; 设置恢复模式&#xff1a; 首先&#xff0c;数据库必须配置为“完整恢复模式”或“大容量…

【Miniconda】Linux系统中 .condarc 配置文件的位置一般在哪里

【Miniconda】Linux系统中 .condarc 配置文件的位置一般在哪里 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到…

3. ElasticSearch搜索技术深入与聚合查询实战

1. ES分词器详解 1.1 基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 1.2 …

疑问彻底搞懂TIME_WAIT状态为什么等待2MSL的时长

文章目录 1. TIME_WAIT状态2. 等待2MSL原因 1. TIME_WAIT状态 TIME_WAIT状态是TCP连接关闭过程中的一个状态&#xff0c;它表示连接已经被关闭&#xff0c;但是仍然在等待一段时间以确保远端接收到连接关闭的确认消息。在这个状态下&#xff0c;连接不再传输数据&#xff0c;但…

单片机FLASH深度解析和编程实践(上)

本篇文章主要针对单片机FLASH编程和FLASH基本原理进行学习分享。以STM32单片机作为实例进行编程实训。 关于FLASH操作的相关寄存器及编程&#xff0c;大家可以参考下一篇文章: 单片机FLASH深度解析和编程实践&#xff08;下&#xff09;-CSDN博客 目录 一、STM32编程方式 二、…

Ansys Lumerical | 激光雷达天线仿真

附件下载 联系工作人员获取附件 在本文中&#xff0c;我们将了解如何根据激光雷达应用需求设计和优化相控阵光栅天线。 概述 激光雷达&#xff08;LIDAR&#xff09;是“light detection and ranging”的简称&#xff0c;近年来由于在机器人、自动驾驶汽车、高精度测绘等领域…

app分发步骤有那些?

APP分发的步骤主要包括以下几个方面&#xff1a; 准备应用程序&#xff1a;首先&#xff0c;开发人员需要确保应用程序已经经过完整的测试和质量保证&#xff0c;包括功能测试、用户体验测试、性能测试等&#xff0c;以确保其稳定性和可靠性。注册开发者账号&#xff1a;在相应…

万物互联的价值

随着我们习惯了万物互联&#xff0c;我们将需要改变我们的行为和使用互联网的方式。这并不像看起来那么困难。毕竟&#xff0c;自 20 世纪 90 年代中期互联网普及以来&#xff0c;你们中的许多人都会经历过各种经历的变化。你们中的许多人已经看到了网络邮件、在线电影和音乐、…

Flink实时写Hudi报NumberFormatException异常

Flink实时写Hudi报NumberFormatException异常 问题描述 在Flink项目中&#xff0c;针对Hudi表 xxxx_table 的 bucket_write 操作由于 java.lang.NumberFormatException 异常而从运行状态切换到失败状态。异常信息显示在解析字符串"ddd7a1ec"为整数时出现了问题。报…

挑战杯 机器视觉的试卷批改系统 - opencv python 视觉识别

文章目录 0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案 4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割 5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现 6 算法测试7 系统实现8 最后 0…

基于comsol七芯光纤超模模拟分析

本期教程主要向大家介绍一期采用comsol有限元分析软件进行七芯光纤模拟分析的模拟教程。首先介绍一下基本知识点 七芯光纤超模理论&#xff08;Supermode Theory for Seven-Core Fibers&#xff09;涉及一种特殊类型的多芯光纤&#xff08;MCF&#xff09;技术。在这里&#x…

jvm 内存泄露、内存溢出、栈溢出区别

JVM&#xff08;Java虚拟机&#xff09;是负责执行Java程序的运行环境。以下是对内存泄露、内存溢出和栈溢出这几个概念的解释&#xff1a; 内存泄露&#xff08;Memory Leak&#xff09;&#xff1a; 内存泄露指的是程序中分配的内存空间在不再被使用时没有被释放的情况。这可…

【消息队列开发】 测试MessageFileManager(对硬盘中的消息操作)类

文章目录 &#x1f343;前言&#x1f384;测试流程&#x1f334;准备工作&#x1f332;测试创建队列功能&#x1f333;测试统计文件的读写&#x1f38b;测试将相应消息放入文件中&#x1f38d;测试读文件里的消息到内存&#x1f340;测试删除消息&#x1f60e;测试垃圾回收⭕总…

MySQL行锁核心知识介绍

MySQL的行锁是数据库中用于控制并发访问的一种机制。它允许在数据库的行级别上实现锁定&#xff0c;从而允许多个事务同时修改不同行的数据&#xff0c;而不会相互干扰。这种锁机制可以提高数据库的并发性能&#xff0c;减少锁争用&#xff0c;提高事务的吞吐量。在本教程中&am…