Java设计模式(八)过滤器模式

2023-05-16

一、概要

过滤器模式是一种结构型设计模式,它允许通过一系列条件来筛选对象,并提供一种灵活的方式来组合和操作这些条件。过滤器模式将过滤条件封装成独立的过滤器类,然后使用这些过滤器来过滤对象集合,以满足特定的条件。

二、代码

以下是一个示例代码,说明过滤器模式的使用:

//1.表示一个产品
public class Product {
    //产品名称
    private String name;
    //产品类别
    private String category;
    //产品价格
    private double price;

    public Product(String name, String category, double price) {
        this.name = name;
        this.category = category;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public String getCategory() {
        return category;
    }

    public double getPrice() {
        return price;
    }
}
//2.过滤器接口
public interface Filter {
    List<Product> filter(List<Product> products);
}
//3.具体过滤器:按类别过滤
public class CategoryFilter implements Filter {
    private String category;

    public CategoryFilter(String category) {
        this.category = category;
    }

    @Override
    public List<Product> filter(List<Product> products) {
        List<Product> filteredProducts = new ArrayList<>();
        for (Product product : products) {
            if (product.getCategory().equals(category)) {
                filteredProducts.add(product);
            }
        }
        return filteredProducts;
    }
}
//4.具体过滤器:按价格过滤
public class PriceFilter implements Filter{
    private double maxPrice;

    public PriceFilter(double maxPrice) {
        this.maxPrice = maxPrice;
    }

    @Override
    public List<Product> filter(List<Product> products) {
        List<Product> filteredProducts = new ArrayList<>();
        for (Product product : products) {
            if (product.getPrice() <= maxPrice) {
                filteredProducts.add(product);
            }
        }
        return filteredProducts;
    }
}
//5.测试类
public class Test {
    public static void main(String[] args) {
        //创建产品列表
        List<Product> products = new ArrayList<>();
        products.add(new Product("iPhone", "Electronics", 999.99));
        products.add(new Product("iPad", "Electronics", 799.99));
        products.add(new Product("MacBook", "Electronics", 1999.99));
        products.add(new Product("Shirt", "Clothing", 29.99));
        products.add(new Product("Jeans", "Clothing", 49.99));

        //过滤类别
        Filter electronicsFilter = new CategoryFilter("Electronics");
        List<Product> electronicsProducts = electronicsFilter.filter(products);
        System.out.println("Electronics products:");
        for (Product product : electronicsProducts) {
            System.out.println(product.getName());
        }

        //过滤价格
        Filter priceFilter = new PriceFilter(50.0);
        List<Product> cheapProducts = priceFilter.filter(products);
        System.out.println("Cheap products:");
        for (Product product : cheapProducts) {
            System.out.println(product.getName());
        }
    }
}

在上述代码中,我们有一个产品类 Product,它包含了产品的名称、类别和价格。我们使用过滤器模式来过滤产品集合。

Filter 是过滤器接口,定义了过滤器的方法 filter()

CategoryFilterPriceFilter 是具体的过滤器实现类,分别用于按类别和价格进行过滤。它们实现了 Filter 接口,并在 filter() 方法中根据特定的条件进行过滤操作。

在测试代码中,我们创建了一个产品集合,并使用过滤器来筛选出满足特定条件的产品。首先,我们使用 CategoryFilter 过滤器筛选出类别为 “Electronics” 的产品,并打印出它们的名称。然后,我们使用 PriceFilter 过滤器筛选出价格低于等于 50.0 的产品,并打印出它们的名称。

通过过滤器模式,我们可以灵活地组合和使用不同的过滤器来满足不同的筛选需求,而不需要修改原有的产品类。这样可以提高代码的可维护性和可扩展性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java设计模式(八)过滤器模式 的相关文章

  • 按下按钮并在java中的新窗口中打开文件

    我创建了一个 JFrame 并放置了一个文本字段和按钮 在文本字段中我放置了从文本文件读取的名称 我知道我想单击按钮并打开一个已知窗口 我想在其中放置名称 其他信息来自同一个文件 这是我的代码 这是我的主框架 package Fronten
  • 我是否需要安装 SQLite 才能使 SQLiteJDBC 正常工作?

    我想我只是没有 明白 如果我的计算机上尚未安装 SQLite 并且我想编写一个使用嵌入式数据库的 Java 应用程序 并且我将 SQLiteJDBC JAR 下载 导入到我的项目中 那么这就是我所需要的吗 或者 我是否需要先安装 SQLit
  • 如何在由子控件组成的 SWT 复合材料上跟踪鼠标?

    我创建了自己的控件 我想跟踪鼠标并添加一个MouseTrackListener 很遗憾MouseEnter and MouseLeave当鼠标移动到我的合成部分 即标签和按钮 上时 也会生成事件 Mouse enter mouse ente
  • eclipse行号状态行贡献项是如何实现的?

    我需要更新状态行编辑器特定的信息 我已经有了自己的实现 但我想看看 eclipse 贡献项是如何实现的 它显示状态行中的行号 列位置 谁能指点一下 哪里可以找到源代码 提前致谢 亚历克斯 G 我一直在研究它 它非常复杂 我不确定我是否了解完
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • 将巨大的模式编译成Java

    有两个主要工具提供了将 XSD 模式编译为 Java 的方法 xmlbeans 和 JAXB 问题是 XSD 模式确实很大 30MB 的 XML 文件 大部分模式在我的项目中没有使用 所以我可以注释掉大部分代码 但这不是一个好的解决方案 目
  • 如何在单个查询中搜索 RealmObject 的 RealmList 字段

    假设我有一堂课 public class Company extends RealmObject private String companyId private RealmList
  • Java Applet 中的 Apache FOP - 未找到数据的 ImagePreloader

    我正在研究成熟商业产品中的一个问题 简而言之 我们使用 Apache POI 库的一部分来读取 Word DOC 或 DOCX 文件 并将其转换为 XSL FO 以便我们可以进行标记替换 然后 我们使用嵌入到 Java 程序中的 FOP 将
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • 如何在 ant 中为 junit 测试设置 file.encoding?

    我还没有完全完成file encoding 和 ant https stackoverflow com questions 1339352 how do i set dfile encoding within ants build xml
  • 从jar中获取资源

    我有包含文件的 jar myJar res endingRule txt myJar wordcalculator merger Marge class 在 Marge java 中我有代码 private static final Str
  • 如何在.NET中使用java.util.zip.Deflater解压缩放气流?

    之后我有一个转储java util zip Deflater 可以确认它是有效的 因为 Java 的Inflater打开它很好 并且需要在 NET中打开它 byte content ReadSample sampleName var inp
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何

随机推荐

  • 在PX4-JMAVSIM软件仿真环境下运行树梅派上的Dronekit飞控应用程序

    苍穹四轴DIY 微信公众号培训教材对Pixhawk飞机加装Raspberry Pi做了介绍 xff0c 关于软件仿真 xff0c 介绍了在Ardupilot飞控系统软件仿真下运行树梅派上的飞控应用程序 xff0c 此文介绍的是在PX4飞控系
  • 在ubuntu上通过编译源代码生成并安装MAVSDK-C++

    版本说明 xff1a ubuntu server 20 0 04 MAVSDK 1 3 1 PX4官网通过编译源代码安装MAVSDK的文章如下 xff1a Building library from Source MAVSDK Guide
  • 在PX4中如何使用offboard模式以及对c_uart_interface_example程序的分析

    c uart interface example是mavlink团队提供的一个演示如何用c语言调用mavlink API对飞机做offboard控制的例子程序 xff0c 这个程序写的挺漂亮的 xff0c 但是 xff0c 新的固件 xff
  • MAVSDK(c++) takeoff_and_land程序分析

    MAVSDK xff08 c 43 43 takeoff and land程序分析 takeoff and land程序是用c 43 43 语言调用MAVSDK API做起飞和降落的控制 MAVSDK xff08 C 43 43 xff09
  • Ubuntu下安装vmware虚拟机软件,vmware上虚拟机的安装、删除

    一直听说虚拟机虚拟机虚拟机 xff0c 关于具体是什么还是不清楚 纸上觉来终觉浅 xff0c 得知此事要躬行 心里的想法千千万 xff0c 只有写下来才能有落地的实感 百科上查找的资料 xff0c 虚拟机 xff08 Virtial Mac
  • 实现Pixhawk 的PX4系统终端

    版本说明 xff1a 1 自驾仪 xff1a Holybro的Pixhawk 4 2 PX4版本 xff1a 1 13 3 宿主机 xff1a Thinkpad笔记本 43 Ubuntu 20 04 2 LTS 参考 xff1a PX4 C
  • QGC开发环境搭建(欢迎交流学习)

    xff10 xff0f 准备好给各位的文件包 xff1a xff11 xff0f 安装QT 链接 xff1a https pan baidu com s 1LvZ7FkDRtHSBFE7YLLBqfw 提取码 xff1a 9kin xff1
  • 四旋翼无人机物理基础

    四旋翼无人机物理基础 1 结构形式2 运动原理 垂直运动 俯仰运动 滚转运动 xff1a 偏航运动 xff1a 前后运动 xff1a 倾向运动 xff1a 1 结构形式 旋翼对称分布在机体的前后 左右四个方向 xff0c 四个旋翼处于同一高
  • npm 清理缓存命令

    npm cache clean f 有些时候npm下载资源出错 xff0c 再次下载的时候可能因为之前错误的缓存造成一直下载不成功 此时可以清一下npm的缓存 xff0c 然后尝试重新下载 使用 可以多清理几次 npm cache clea
  • Taro 和 uni-app选型对比

    Taro 和 uni app选型对比 一 Taro和uni app的介绍 1 taro的介绍 taro是多端统一开发框架 xff0c 支持用 React 的开发方式编写一次代码 xff0c 生成能运行在微信 百度 支付宝 字节跳动小程序 H
  • 小程序 连接websocket 开发者工具上可以,但是真机上不行

    连接websocket 开发者工具上可以 xff0c 但是真机上不行 一定要保证真机和websocket机器在同一个网段 xff1b 基础库 2 4 0 提供了 wx startLocalServiceDiscovery 等一系列 mDNS
  • JS filter()方法 介绍和使用

    filter方法是js中常用的方法 xff1b 一 xff0c 作用 xff1b filter用于对数组进行过滤 它创建一个新数组 xff0c 新数组中的元素是通过检查指定数组中符合条件的所有元素 注意 xff1a filter 不会对空数
  • JS object对象转为array数组

    在开发中经常会遇到接口返回的是对象 xff0c 我们需要转为数组 xff0c 下面提供两种方法 xff1a 第一种方法 xff0c Object values span class token keyword var span data s
  • JS关闭当前页面

    JS关闭当前页面 span class token operator lt span button onclick span class token operator 61 span span class token string 34 C
  • 【马井堂】Js 去掉对象前后空格

    Js 去掉对象前后空格 function emptyParams data const temporary 61 Object assign data for const key in temporary if key if tempora
  • VMware 虚拟机与主机通信三种方式总结

    背景 xff1a ubuntu16 04安装vmware14pro xff0c 开了两台ubuntu12 04的虚拟机 第一台基于NAT方式连接 xff0c 第二台基于Bridged方式连接 主机IP xff1a 192 168 100 1
  • JS 下载-支持多个浏览器(马井堂)

    JS 下载 支持多个浏览器 const downLoadXls 61 fileArrayBuffer filename 61 gt let data 61 new Blob fileArrayBuffer type 39 applicati
  • js微信小程序-版本更新管理器wx.getUpdateManager()、UpdateManager

    js微信小程序 版本更新管理器wx getUpdateManager UpdateManager 1 wx getUpdateManager 官方文档 版本更新管理器wx getUpdateManager 官方文档 wx getUpdate
  • 串口通信+TCP网络通信简单综合实例

    串口通信 43 TCP网络通信简单综合实例 串口通信加上TCP网络通信之后就可以简单实现本地设备的联网功能了 xff0c 哈哈 xff0c 话不多说 xff0c 直接上代码 总体上还是C S模式 xff0c 但是这个客户端加上了对串口的操作
  • Java设计模式(八)过滤器模式

    一 概要 过滤器模式是一种结构型设计模式 xff0c 它允许通过一系列条件来筛选对象 xff0c 并提供一种灵活的方式来组合和操作这些条件 过滤器模式将过滤条件封装成独立的过滤器类 xff0c 然后使用这些过滤器来过滤对象集合 xff0c