掌握高级设计原则: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;
    }

    @Override
    public 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;
    }

    @Override
    public 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;
    }

    @Override
    public 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. 需协调数据流:在多个过滤器之间传递数据可能会使数据流的控制变得更加复杂。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据指标体系方法—OSM模型

了解 OSM 模型 OSM 模型&#xff0c;全称为 Object-Strategy-Measure 模型。 O 代表业务目标&#xff0c;不仅仅是指公司战略级别的目标&#xff0c;也包含了产品中某个功能的目的&#xff0c;某场活动的目标等。S 代表业务策略&#xff0c;这里指的是要实现 O 需要采用的策略…

【Linux】从零开始认识进程 — 前篇

我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。。——山本耀司 从零开始认识进程 1 认识冯诺依曼体系2 操作系统3 进程3.1 什么是进程&#xff1f;&#xff1f;&#xff1f;3.2 进程管理PCB 3.3 Linux中的进程深入理解 3.4 进程创建总结 送给…

Flink 集群部署模式

文章目录 前言一、会话模式&#xff08;Session Mode&#xff09;二、单作业模式&#xff08;Per-Job Mode&#xff09;三、应用模式&#xff08;Application Mode&#xff09; 前言 Flink支持多种集群部署模式&#xff0c;以满足不同场景和需求。以下是Flink的主要集群部署模…

计算机网络(5)-----网络层

目录 一.网络层的功能和概述 二.转发相关 1.网络层协议 &#xff08;1&#xff09;IP协议 •IP数据报格式&#xff1a; •IP数据报分片&#xff1a; •IP地址&#xff1a; •IP地址的分类&#xff1a; •网络地址转换NAT&#xff1a; •子网划分&#xff1a; •无分…

拼多多获得搜索词统计 API 返回值说明

拼多多获得搜索词统计的API返回值通常包含与搜索词相关的统计数据和信息。 item_search_data-获得搜索词统计获取调用详情链接 pinduoduo.item_search_data 公共参数 响应参数 - 请求示例 url 默认请求参数已经URL编码处理 curl -i "https://api-gw-xxx.cn/pinduoduo/it…

F. Chat Screenshots

思路&#xff1a;拓扑排序&#xff0c;如果存在满足所有截图的顺序&#xff0c;那么这个图中就会存在拓扑排序&#xff0c;这意味着图中不会存在循环。因此&#xff0c;我们的目标就是检查图的非循环性。 代码&#xff1a; int b[200010], vis[200010], edge[200010]; vector&…

云备份项目2

云备份项目 文章目录 云备份项目4. 服务端代码设计4.1 服务端工具类实现4.1.1 文件实用工具类设计4.1.2 Json实用工具类设计 4.2 服务端配置信息模块实现4.2.1 系统配置信息4.2.2 单例文件配置类设计 4.3 服务端数据管理模块实现4.3.1 备份数据类的实现4.3.2 数据管理类的设计 …

关于数据通信知识的补充——第二篇

目录 四.二层交换机 5.实现不同vlan通信的原理 方法一&#xff1a;路由器网关 方法二&#xff1a;单臂路由 方法三&#xff1a;三层交换机 五.三层路由技术 &#xff08;1&#xff09;直连路由 &#xff08;2&#xff09;静态路由 &#xff08;3&#xff09;动态路由 …

HJXH-E1/U静态信号继电器 面板安装 辅助电源220VDC 启动电压220VDC JOSEF约瑟

HJXH系列静态信号继电器 HJXH-61/U静态信号继电器&#xff1b; HJXH-61/I静态信号继电器&#xff1b; HJXH-62/U静态信号继电器&#xff1b; HJXH-62/I静态信号继电器&#xff1b; HJXH-E1/U静态信号继电器&#xff1b; HJXH-E1/I静态信号继电器&#xff1b; HJXH-E2/U静态信号…

增量式PID恒压供水控制框图

1、SMART PLC增量式PID完整供水和算法介绍请参考下面文章链接: https://rxxw-control.blog.csdn.net/article/details/125767636https://rxxw-control.blog.csdn.net/article/details/125767636 2、SMART PLC增量式PID温度控制系统框图(PWM) https://rxxw-control.blog.csd…

02、字面量与变量

二、字面量与变量 文章目录 二、字面量与变量1、字面量字面量类型扩展&#xff1a;特殊字符 2、变量进制转换 3、数据类型 1、字面量 字面量又叫做常量&#xff0c;字面值常量&#xff0c;告诉程序员数据在程序中的书写格式。 字面量类型 整数类型(int)&#xff1a;不带小数点…

【Vue3】源码解析-Runtime

文章目录 系列文章packages/runtime-dom/src/index.ts初始化创建renderermount \src\runtime-core\component.jsh.tspackages/runtime-core/src/renderer.ts挂载及卸载DOM节点render packages/runtime-dom/src/nodeOps.tspackages/runtime-core/src/apiCreateApp.ts创建appmoun…

【蓝桥杯选拔赛真题67】python奇偶数位相乘 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python奇偶数位相乘 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python奇偶数位相乘 第十五届蓝桥杯青少年组python比赛选拔赛真题 一…

FFT-相干采样和绘制信号被采样后的频谱方法

1.相干采样&#xff1a;要保证后一个输入信号周期内被采样的点和前一个周期的点有一点差别&#xff0c;避免只采到每个周期内一样点从而掩盖了真实性能。所以需要fs/finM/N为无理数&#xff0c;并且为了尽可能多的采到不同值&#xff0c;fs/fin取大些。例如fs/fin5Ghz/570Mhz50…

ChatGPT编程—实现小工具软件(文件查找和筛选)

ChatGPT编程—实现小工具软件(文件查找和筛选) 今天借助[小蜜蜂AI][https://zglg.work]网站的ChatGPT编程实现一个功能&#xff1a;根据特定需求结合通配符和其他条件来进行文件查找和筛选。在这个例子中&#xff0c;我们将创建一个函数find_files&#xff0c;它接受用户输入的…

机器学习-04-分类算法-03KNN算法

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中分类算法&#xff0c;本篇为分类算法与knn算法部分。 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程化…

考察c语言关键字

C语言——关键字 1.问题&#xff1a;简述goto语句的作用 答&#xff1a;无条件跳转 具体来说&#xff0c;其作用在于允许程序在执行时无条件地跳转到指定的标签位置&#xff0c;并从该标签位置继续执行。通过goto语句&#xff0c;可以实现程序流程的无条件转移&#xff0c;使得…

【CKA模拟题】查询消耗CPU最多的Pod

题干 For this question, please set this context (In exam, diff cluster name) 对于此问题&#xff0c;请设置此上下文&#xff08;在考试中&#xff0c;diff 集群名称&#xff09; kubectl config use-context kubernetes-adminkubernetesFind the pod that consumes the …

排成一行的正方形染色问题

有r个正方形排成一行,今用红、黄、白、蓝四种颜色给这个r个正方形染色&#xff0c;每个正方形只能染一种颜色&#xff0c;如果要求染红、黄、白色的正方形分别至少出现一个&#xff0c;问有多少种不同的染色法? 从红、黄、白、蓝4种颜色中,允许重复的取出r个进行排列,其中红…

【汇编】#5 80x86指令系统其一(数据传送与算术)

文章目录 一、数据传送指令1. 通用数据传送指令1.1 MOV传送指令tips:MOV指令几条特殊规定 1.2 XCHG交换指令1.3 进栈指令PUSH1.4 出栈指令POP1.5 所有寄存器进出栈指令PUSHA/POPAtips:SP特别处理 2. 累加器专用传送指令2.1 输入指令IN2.2 OUT输出指令2.3 IO端口与8086CPU通讯关…