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设计模式(八)过滤器模式 的相关文章

  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 在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