设计模式——过滤器模式
一、定义和概念
- 定义
C++ 过滤器模式(Filter Pattern)也称为标准模式(Criteria Pattern),是一种设计模式,用于根据不同的标准或条件从一组对象中筛选出符合条件的对象。它将筛选条件的逻辑封装在不同的过滤器类中,使得筛选过程更加灵活和可维护。 - 核心思想
把对象的筛选操作从使用这些对象的业务逻辑中分离出来。通过定义一系列的过滤条件类,每个类负责一种特定的筛选逻辑,然后可以组合这些过滤条件来实现复杂的筛选需求。
二、结构和组成部分
目标对象(Object)
- 定义:
这些是需要被筛选的对象,它们通常具有一些属性,而筛选条件就是基于这些属性来判断对象是否符合要求。例如,一个员工类,包含员工的姓名、年龄、部门等属性,这些员工对象就是目标对象。 - 代码示例(简单的员工类)
class Employee {
public:std::string name;int age;std::string department;Employee(const std::string& n, int a, const std::string& d) : name(n), age(a), department(d) {}
};
过滤器接口(Filter Interface)
- 定义:
它定义了一个通用的过滤方法,所有具体的过滤器类都需要实现这个接口。这个接口是实现多态筛选的基础,使得客户端可以统一地调用不同的过滤器而无需知道它们的具体实现细节。 - 代码示例
class Filter {
public:virtual std::vector<Employee*> filter(const std::vector<Employee*>& employees) = 0;virtual ~Filter() {}
};
具体过滤器类(Concrete Filter Classes)
- 定义:
这些类实现了过滤器接口,并包含了具体的筛选逻辑。例如,可以有一个根据年龄筛选员工的过滤器类,还有一个根据部门筛选员工的过滤器类等。 - 代码示例(根据年龄筛选的过滤器类)
class AgeFilter : public Filter {
private:int minAge;int maxAge;public:AgeFilter(int min, int max) : minAge(min), maxAge(max) {}std::vector<Employee*> filter(const std::vector<Employee*>& employees) override {std::vector<Employee*> result;for (Employee* employee : employees) {if (employee->age >= minAge && employee->age <= maxAge) {result.push_back(employee);}}return result;}
};
- 代码示例(根据部门筛选的过滤器类)
class DepartmentFilter : public Filter {
private:std::string department;public:DepartmentFilter(const std::string& d) : department(d) {}std::vector<Employee*> filter(const std::vector<Employee*>& employees) override {std::vector<Employee*> result;for (Employee* employee : employees) {if (employee->department == department) {result.push_back(employee);}}return result;}
};
三、应用场景
数据查询和筛选系统
- 在数据库管理系统或数据查询界面中,过滤器模式可以帮助用户根据不同的条件筛选数据。例如,在一个员工信息管理系统中,用户可以通过年龄、部门、职位等条件筛选出符合需求的员工列表,就像在 SQL 语句中使用 WHERE 子句一样。
- 图像处理和分析
在图像处理软件中,过滤器模式可用于筛选图像中的特定元素。例如,根据颜色范围筛选像素,或者根据形状特征筛选图像中的物体等。 - 游戏开发中的对象管理
在游戏中,可以使用过滤器模式来筛选特定类型的游戏对象。比如,在一个角色扮演游戏中,根据角色的阵营、等级、技能等属性筛选出符合条件的角色,用于组队、战斗匹配或任务分配等操作。
四、优缺点
优点
- 可维护性好:
将不同的筛选逻辑封装在各自的类中,使得代码结构清晰,易于维护和修改。如果需要添加新的筛选条件,只需要创建一个新的过滤器类并实现过滤接口即可。 - 可组合性强:
可以通过组合多个过滤器来实现复杂的筛选需求。例如,可以先根据部门筛选员工,再从筛选结果中根据年龄进一步筛选,这种组合方式非常灵活。 - 符合开闭原则:
对扩展开放,对修改关闭。添加新的筛选条件不需要修改现有的业务逻辑代码,只需要添加新的过滤器类。
缺点 - 增加类的数量:
对于每一种筛选条件都需要创建一个对应的过滤器类,可能会导致类的数量过多,使项目结构变得复杂,尤其是在筛选条件非常多的情况下。 - 运行效率可能受影响:
如果需要对大量对象进行多次过滤,每次过滤都需要遍历对象集合,可能会导致性能问题,特别是在实时性要求较高的应用场景中。
总的来说,C++ 过滤器模式在需要灵活筛选对象的场景中非常有用,但在使用时需要权衡其优缺点,根据实际情况决定是否采用。
相关文章:
设计模式——过滤器模式
一、定义和概念 定义 C 过滤器模式(Filter Pattern)也称为标准模式(Criteria Pattern),是一种设计模式,用于根据不同的标准或条件从一组对象中筛选出符合条件的对象。它将筛选条件的逻辑封装在不同的过滤器…...
Unity(四十八):Unity与Web双向交互
效果 游戏对象绑定脚本 游戏脚本源码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Tent : MonoBehaviour {public Camera camera;// Start is called before the first frame updatevoid Start(){}// Update is called once…...
web前端--网页练习
html代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>小米</title><!-- 引…...
信息安全入门——网络安全控制
目录 前言信息安全入门:网络安全控制基础1. 用户识别技术:确认你是谁2. 访问控制技术:定义你能做什么3. 访问控制列表(ACL):精细的权限管理4. 漏洞控制:防范未然5. 入侵检测系统(IDS…...
跟着鸟儿学飞行?扑翼机器人的感知秘籍
大家好!今天来了解一篇扑翼机器人的研究——《Avian-inspired embodied perception in biohybrid flapping-wing robotics》发表于《Nature Communications》。在广阔天空中,鸟类凭借精妙翅膀结构与敏锐感知自由翱翔,这一直吸引着科学家探索其…...
Python画笔案例-093 绘制 彩虹图
1、绘制 彩虹图 通过 python 的turtle 库绘制 彩虹图,如下图: 2、实现代码 绘制 彩虹图,以下为实现代码: """彩虹图.py """ import turtledef draw_semi_circle(radius):"""画半圆函数"""turtle...
【数据结构】贪心算法:决策的艺术
贪心算法(Greedy Algorithm)是一类在每一步选择中都采取局部最优解的方法,希望最终能够达到全局最优解。通俗地说,贪心算法的思想就是“每一步都尽量做出最好的选择”,以期望整个过程的最终结果也达到最优状态。贪心算…...
Linux LVS详解
LVS(Linux Virtual Server)即Linux虚拟服务器,是一个基于Linux操作系统的高性能、可扩展的负载均衡器。以下是对LVS的详细介绍: 一、简介 LVS项目由章文嵩博士在1998年5月发起,是中国国内最早出现的自由软件项目之一…...
LabVIEW显微镜自动对焦系统
在生物医学研究中,显微镜图像的清晰度对于细胞分析非常重要。传统的手动对焦方法容易受到人为因素的影响,因此开发了一种自动对焦技术,以提高图像采集的准确性和效率。 自动对焦方法概述 该系统结合了图像清晰度评估和一维功能优化ÿ…...
基于IP的真实地址生成器
ip-geoaddress-generator 是一个基于 Web 的在线应用程序,能够根据 IP 地址生成真实的随机地址信息。通过多个 API 获取位置数据和随机用户信息,该工具为用户提供了完整的虚拟身份。它由 Next.js 和 Radix UI 构建,具备自动检测当前 IP 地址和…...
下面程序头的三个import语句可以合并或简化么?
下面程序头的三个import语句可以合并或简化么? from tkinter.simpledialog import askinteger from tkinter import * from tkinter import messagebox ——是的,三个import语句可以合并为一个。 合并后的import语句如下所示: from tkinte…...
深度学习--CNN实现猫狗识别二分类(附带下载链接, 长期有效)
1. 代码实现(包含流程解释) 样本量: 8005 # # 1.导入数据集(加载图片)数据预处理# 进行图像增强, 通过对图像的旋转 ,缩放,剪切变换, 翻转, 平移等一系列操作来生成新样本, 进而增加样本容量, # 同时对图片数值进行归一化[0:1] from tensorflow.keras.preprocessing.image …...
Depcheck——专门用于检测 JavaScript 和 Node.js 项目中未使用依赖项的工具
文章目录 Depcheck 是什麽核心功能📚检测未使用的依赖🐛检测缺失的依赖✨支持多种文件类型🌍可扩展性 安装与使用1. 安装 Depcheck2. 使用 Depcheck Depcheck 的应用总结项目源码: Depcheck 是什麽 来看一个常见错误场景…...
前端构建工具vite的优势
1. 极速冷启动 Vite 使用原生 ES 模块 (ESM) 在开发环境下进行工作。相比于传统构建工具需要打包所有的文件,Vite 只在浏览器请求模块时动态加载所需的文件。无打包冷启动:无需预先打包,项目启动非常快,尤其对于大型项目效果更明…...
hive查询语句
1.基本语法 SELECT [ALL | DISTINCT]select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BYcol_list] [HAVING where_condition] [ORDER BYcol_list] [CLUSTER BYcol_list | [DISTRIBUTE BY col_list] [SORT BY col_list] ] [LIMIT number] …...
【AIGC】2024-ECCV-ControlNet++:通过有效的一致性反馈改进条件控制
2024-ECCV-ControlNet: Improving Conditional Controls with Efficient Consistency Feedback ControlNet:通过有效的一致性反馈改进条件控制摘要1. 引言2. 相关工作2.1 基于扩散的生成模型2.2 可控的文本到图像扩散模型2.3 语言和视觉奖励模型 3. 方法3.1. 初步3.…...
Mysql5.7变为GreatSQL 8.0.32-25过程中,SQL语句报错及解决方案
考虑兼容国产化数据库,现需要将Mysql5.7变为GreatSQL,在执行部分sql时,发现在Mysql5.7无报错,在GreatSQL有报错,在此记录一下遇到的几个错误。 1.ERROR 1231 (NO_AUTO_CREATE_USER) 1.1.报错提示 ERROR 1231 (42000…...
Qt 使用QAxObject将QTableView数据导出到Excel表格
这是我记录Qt学习过程的第6篇心得文章,主要是方便自己编写的应用程序导出Excel数据的,走了不少弯路直接上代码。 实现代码: //人员信息导出 ui->pbtn2->setEnabled(false); // 打开文件对话框,选择 excel文件 QString fil…...
fastGpt
参考本地部署FastGPT使用在线大语言模型 1 rockylinx 1 ollama安装 在rockylinux中安装的,ollama由1.5G,还是比较大,所有采用在windows下下载,然后安装的方式,linux安装 tar -C /usr -xzf ollama-linux-amd64.tgz #…...
如何全方位应对服务可用性的挑战
在数字化转型的浪潮中,运维团队正站在企业IT架构的核心位置,面对着前所未有的挑战。服务响应时间和失败率,作为衡量服务质量的重要指标,一直备受关注。然而,在追求这两项指标优化的同时,运维团队还需关注其…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...
边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...
