安卓常见设计模式13------过滤器模式(Kotlin版)
W1 是什么,什么是过滤器模式?
- 过滤器模式(Filter Pattern)是一种常用的结构型设计模式,用于根据特定条件过滤和筛选数据。
2. W2 为什么,为什么需要使用过滤器模式,能给我们编码带来什么好处?
-
解耦过滤逻辑:过滤器模式可以将过滤逻辑从主要业务逻辑中解耦出来。通过将过滤逻辑封装在独立的过滤器类中,可以使主要业务逻辑更加清晰和简洁。过滤器模式使得业务逻辑和过滤逻辑可以独立变化,互不影响。
-
可扩展性:通过使用过滤器模式,可以方便地添加新的过滤器类来满足不同的过滤需求。每个过滤器类负责不同的筛选条件或规则,使得系统具有良好的可扩展性。可以根据需要灵活地组合和应用不同的过滤器,以满足不同的过滤需求,而无需修改现有的代码。
-
可重用性:过滤器模式可以使过滤器类在不同的场景中被重复使用。通过定义通用的过滤器接口和基础的过滤器类,可以在不同的数据或对象集合上应用相同的过滤逻辑。这样可以减少重复编写相似代码的工作量,提高代码的可重用性。
-
灵活性和动态性:过滤器模式使得过滤条件和筛选规则可以在运行时动态地组合和调整。通过将过滤器类作为参数传递或在运行时动态创建过滤器对象,可以根据实际需求灵活地改变过滤条件。这种灵活性和动态性使得过滤器模式在需要根据不同条件进行动态过滤的场景中非常有用。
3. W3,如何使用?下面是代码示例:
定义数据类(Data Class):
data class Product(val name: String, val category: String, val price: Double)
在上述示例中,我们定义了一个简单的数据类Product,其中包含了商品的名称、类别和价格。
定义过滤器接口(Filter):
interface Filter {fun filter(products: List<Product>): List<Product>
}
过滤器接口定义了一个filter()方法,用于对商品列表进行过滤操作。
实现具体的过滤器:
class CategoryFilter(private val category: String) : Filter {override fun filter(products: List<Product>): List<Product> {return products.filter { it.category == category }}
}class PriceRangeFilter(private val minPrice: Double, private val maxPrice: Double) : Filter {override fun filter(products: List<Product>): List<Product> {return products.filter { it.price in minPrice..maxPrice }}
}
在上述示例中,我们实现了两个具体的过滤器。CategoryFilter根据商品的类别进行过滤,而PriceRangeFilter根据商品的价格范围进行过滤。
示例代码:
fun main() {val products = listOf(Product("xiaomi14", "Electronics", 999.99),Product("yaoyaolinxian", "Electronics", 899.99),Product("A zhui", "Shoes", 129.99),Product("addas", "Shoes", 149.99),Product("iPhone 99plus", "Electronics", 1299.99))val categoryFilter = CategoryFilter("Electronics")val filteredByCategory = categoryFilter.filter(products)println("Filtered by category:")filteredByCategory.forEach { println(it) }val priceRangeFilter = PriceRangeFilter(100.0, 1000.0)val filteredByPriceRange = priceRangeFilter.filter(products)println("Filtered by price range:")filteredByPriceRange.forEach { println(it) }// 输出:// Filtered by category:// Product(name=xiaomi14, category=Electronics, price=999.99)// Product(name=yaoyaolinxian, category=Electronics, price=899.99)// Product(name=iPhone 99plus, category=Electronics, price=1299.99)// Filtered by price range:// Product(name=xiaomi14, category=Electronics, price=999.99)// Product(name=yaoyaolinxian, category=Electronics, price=899.99)// Product(name=A zhui, category=Shoes, price=129.99)// Product(name=addas, category=Shoes, price=149.99)
}
我们实际开发中可以使用Kotlin中的List.filter()函数,利用Lambda表达式作为过滤器的条件。以下是使用List.filter()接口实现过滤器模式的示例代码:
data class Product(val name: String, val category: String, val price: Double)fun main() {val products = listOf(Product("xiaomi14", "Electronics", 999.99),Product("yaoyaolinxian", "Electronics", 899.99),Product("A zhui", "Shoes", 129.99),Product("addas", "Shoes", 149.99),Product("iPhone 99plus", "Electronics", 1299.99))val category = "Electronics"val filteredByCategory = products.filter { it.category == category }println("Filtered by category:")filteredByCategory.forEach { println(it) }val minPrice = 100.0val maxPrice = 1000.0val filteredByPriceRange = products.filter { it.price in minPrice..maxPrice }println("Filtered by price range:")filteredByPriceRange.forEach { println(it) }// 输出:// Filtered by category:// Product(name=xiaomi14, category=Electronics, price=999.99)// Product(name=yaoyaolinxian, category=Electronics, price=899.99)// Product(name=iPhone 99plus, category=Electronics, price=1299.99)// Filtered by price range:// Product(name=xiaomi14, category=Electronics, price=999.99)// Product(name=yaoyaolinxian, category=Electronics, price=899.99)// Product(name=A zhui, category=Shoes, price=129.99)// Product(name=addas, category=Shoes, price=149.99)
}
这样就方便的多了。
Thank you for your reading, best regards!
相关文章:
安卓常见设计模式13------过滤器模式(Kotlin版)
W1 是什么,什么是过滤器模式? 过滤器模式(Filter Pattern)是一种常用的结构型设计模式,用于根据特定条件过滤和筛选数据。 2. W2 为什么,为什么需要使用过滤器模式,能给我们编码带来什么好处…...
使用spark进行递归的可行方案
在实际工作中会遇到,最近有需求将产品炸开bom到底层,但是ERP中bom数据在一张表中递归存储的,不循环展开,是无法知道最底层原材料是什么。 在ERP中使用pl/sql甚至sql是可以进行炸BOM的,但是怎么使用spark展开࿰…...
Spring -Spring之依赖注入源码解析(下)--实践(流程图)
IOC依赖注入流程图 注入的顺序及优先级:type-->Qualifier-->Primary-->PriOriry-->name...
前端设计模式之【单例模式】
文章目录 前言介绍实现单例模式优缺点?后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:前端设计模式 🐱👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出…...
设备零部件更换ar远程指导系统加强培训效果
随着科技的发展,AR技术已经成为了一种广泛应用的新型技术。AR远程指导系统作为AR技术的一种应用,具有非常广泛的应用前景。 一、应用场景 气象监测AR教学软件适用于多个领域,包括气象、环境、地理等。在教学过程中,软件可以帮助学…...
文本生成高精准3D模型,北京智源AI研究院等出品—3D-GPT
北京智源AI研究院、牛津大学、澳大利亚国立大学联合发布了一项研究—3D-GPT,通过文本问答方式就能创建高精准3D模型。 据悉,3D-GPT使用了大语言模型的多任务推理能力,通过任务调度代理、概念化代理和建模代理三大模块,简化了3D建模的开发流程…...
Netty入门指南之NIO 网络编程
作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言基础扫…...
LeetCode(6)轮转数组【数组/字符串】【中等】
目录 1.题目2.答案3.提交结果截图 链接: 189. 轮转数组 1.题目 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1…...
华为云Ascend310服务器使用
使用华为云服务器 cpu: 16vCPUs Kunpeng 920 内存:16GiB gpu:4* HUAWEI Ascend 310 cann: 20.1.rc1 操作系统:Ubuntu aarch64目的 使用该服务器进行docker镜像编译,测试模型。 已知生产环境:mindx版本为3.0.rc3&a…...
【poi导出excel模板——通过建造者模式+策略模式+函数式接口实现】
poi导出excel模板——通过建造者模式策略模式函数式接口实现 poi导出excel示例优化思路代码实现补充建造者模式策略模式 poi导出excel示例 首先我们现看一下poi如何导出excel,这里举个例子:目前想要导出一个Map<sex,List>信息,sex作为…...
自适应模糊PID控制器在热交换器温度控制中的应用
热交换器是一种常见的热能传递设备,广泛应用于各个工业领域。对热交换器温度进行有效控制具有重要意义,可以提高能源利用效率和产品质量。然而,受到热传导特性和外部环境变化等因素的影响,热交换器温度控制难度较大。本文提出一种…...
【系统救援】 Ubuntu重启失败,报错:UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY
问题定位及处理 查看错误信息:/dev/sda3 contains a file system with errors, check forced. /dev/sda3: Inodes that were part of a corrupted orphan linked list found. /dev/sda3: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY. (i.e., without -a or -p o…...
【数据结构】树与二叉树(八):二叉树的中序遍历(非递归算法NIO)
文章目录 5.2.1 二叉树二叉树性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点,其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…...
第九章 排序【数据结构】【精致版】
第九章 排序【数据结构】【精致版】 前言版权第九章 排序9.1 概述9.2 插入类排序9.2.1 直接插入排序**1-直接插入排序.c** 9.2.2 折半插入排序**2-折半插入排序.c** 9.2.3 希尔排序 9.3 交换类排序9.3.1冒泡排序**4-冒泡排序.c** 9.3.2 快速排序**5-快速排序.c** 9.4 选择类排…...
基于element-plus定义表格行内编辑配置化
文章目录 前言一、新增table组件二、使用步骤 前言 在 基于element-plus定义表单配置化 基础上,封装个Element-plus的table表格 由于表格不同于form组件,需自定义校验器,以下组件配置了单个校验,及提交统一校验方法,且…...
WebGL-Vue3-TS-Threejs:基础练习 / Javascript 3D library / demo
一、理解Three.js Three.js是一个用于WebGL渲染的JavaScript库。它提供了一组工具和类,用于创建和渲染3D图形和动画。简单理解(并不十分准确),Three.js之于WebGL,好比,jQuery.js之于JavaScript。 OpenGL …...
2022年12月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 有n个按名称排序的商品,使用对分查找法搜索任何一商品,最多查找次数为5次,则n的值可能为?()(2分) A.5 B.15 C.30 D.35 答案:C 答案解析:对分查找最多查找次数m与个数之间n的…...
确定性 vs 非确定性:GPT 时代的新编程范式
分享嘉宾 | 王咏刚 责编 | 梦依丹 出品 | 《新程序员》编辑部 在 ChatGPT 所引爆的新一轮编程革命中,自然语言取代编程语言,在只需编写提示词/拍照就能出程序的时代,未来程序员真的会被简化为提示词的编写员吗?通过提示词操纵 …...
【Linux奇遇记】我和Linux的初次相遇
🌈个人主页: Aileen_0v0 🔥系列专栏:Linux奇遇记系列专栏💫"没有罗马,那就自己创造罗马~" 目录 前端和后端的介绍 1.前端 2.后端 3.前后端区别 Linux在前后端开发中的角色 如何学习Linux 去进行程序开发 Linux的常见根目…...
剪贴板劫持--PasteJacker的使用
启动 PasteJacker [1] Windows [2] Linux [3] Exit第一次是让我们选择要攻击针对的目标系统,这里以Windows系统为例,即我自己的物理机 因此键入 1 ,回车 [1] Download and execute a msfvenom backdoor using certutil (Web delivery Past…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
