当前位置: 首页 > news >正文

设计模式——过滤器模式

一、定义和概念

  • 定义
    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 过滤器模式&#xff08;Filter Pattern&#xff09;也称为标准模式&#xff08;Criteria Pattern&#xff09;&#xff0c;是一种设计模式&#xff0c;用于根据不同的标准或条件从一组对象中筛选出符合条件的对象。它将筛选条件的逻辑封装在不同的过滤器…...

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代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>小米</title><!-- 引…...

信息安全入门——网络安全控制

目录 前言信息安全入门&#xff1a;网络安全控制基础1. 用户识别技术&#xff1a;确认你是谁2. 访问控制技术&#xff1a;定义你能做什么3. 访问控制列表&#xff08;ACL&#xff09;&#xff1a;精细的权限管理4. 漏洞控制&#xff1a;防范未然5. 入侵检测系统&#xff08;IDS…...

跟着鸟儿学飞行?扑翼机器人的感知秘籍

大家好&#xff01;今天来了解一篇扑翼机器人的研究——《Avian-inspired embodied perception in biohybrid flapping-wing robotics》发表于《Nature Communications》。在广阔天空中&#xff0c;鸟类凭借精妙翅膀结构与敏锐感知自由翱翔&#xff0c;这一直吸引着科学家探索其…...

Python画笔案例-093 绘制 彩虹图

1、绘制 彩虹图 通过 python 的turtle 库绘制 彩虹图,如下图: 2、实现代码 绘制 彩虹图,以下为实现代码: """彩虹图.py """ import turtledef draw_semi_circle(radius):"""画半圆函数"""turtle...

【数据结构】贪心算法:决策的艺术

贪心算法&#xff08;Greedy Algorithm&#xff09;是一类在每一步选择中都采取局部最优解的方法&#xff0c;希望最终能够达到全局最优解。通俗地说&#xff0c;贪心算法的思想就是“每一步都尽量做出最好的选择”&#xff0c;以期望整个过程的最终结果也达到最优状态。贪心算…...

Linux LVS详解

LVS&#xff08;Linux Virtual Server&#xff09;即Linux虚拟服务器&#xff0c;是一个基于Linux操作系统的高性能、可扩展的负载均衡器。以下是对LVS的详细介绍&#xff1a; 一、简介 LVS项目由章文嵩博士在1998年5月发起&#xff0c;是中国国内最早出现的自由软件项目之一…...

LabVIEW显微镜自动对焦系统

在生物医学研究中&#xff0c;显微镜图像的清晰度对于细胞分析非常重要。传统的手动对焦方法容易受到人为因素的影响&#xff0c;因此开发了一种自动对焦技术&#xff0c;以提高图像采集的准确性和效率。 自动对焦方法概述 该系统结合了图像清晰度评估和一维功能优化&#xff…...

基于IP的真实地址生成器

ip-geoaddress-generator 是一个基于 Web 的在线应用程序&#xff0c;能够根据 IP 地址生成真实的随机地址信息。通过多个 API 获取位置数据和随机用户信息&#xff0c;该工具为用户提供了完整的虚拟身份。它由 Next.js 和 Radix UI 构建&#xff0c;具备自动检测当前 IP 地址和…...

下面程序头的三个import语句可以合并或简化么?

下面程序头的三个import语句可以合并或简化么&#xff1f; from tkinter.simpledialog import askinteger from tkinter import * from tkinter import messagebox ——是的&#xff0c;三个import语句可以合并为一个。 合并后的import语句如下所示&#xff1a; from tkinte…...

深度学习--CNN实现猫狗识别二分类(附带下载链接, 长期有效)

1. 代码实现(包含流程解释) 样本量: 8005 # # 1.导入数据集(加载图片)数据预处理# 进行图像增强, 通过对图像的旋转 ,缩放,剪切变换, 翻转, 平移等一系列操作来生成新样本, 进而增加样本容量, # 同时对图片数值进行归一化[0:1] from tensorflow.keras.preprocessing.image …...

Depcheck——专门用于检测 JavaScript 和 Node.js 项目中未使用依赖项的工具

文章目录 Depcheck 是什麽核心功能&#x1f4da;检测未使用的依赖&#x1f41b;检测缺失的依赖✨支持多种文件类型&#x1f30d;可扩展性 安装与使用1. 安装 Depcheck2. 使用 Depcheck Depcheck 的应用总结项目源码&#xff1a; Depcheck 是什麽 来看一个常见错误场景&#x1…...

前端构建工具vite的优势

1. 极速冷启动 Vite 使用原生 ES 模块 (ESM) 在开发环境下进行工作。相比于传统构建工具需要打包所有的文件&#xff0c;Vite 只在浏览器请求模块时动态加载所需的文件。无打包冷启动&#xff1a;无需预先打包&#xff0c;项目启动非常快&#xff0c;尤其对于大型项目效果更明…...

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&#xff1a;通过有效的一致性反馈改进条件控制摘要1. 引言2. 相关工作2.1 基于扩散的生成模型2.2 可控的文本到图像扩散模型2.3 语言和视觉奖励模型 3. 方法3.1. 初步3.…...

Mysql5.7变为GreatSQL 8.0.32-25过程中,SQL语句报错及解决方案

考虑兼容国产化数据库&#xff0c;现需要将Mysql5.7变为GreatSQL&#xff0c;在执行部分sql时&#xff0c;发现在Mysql5.7无报错&#xff0c;在GreatSQL有报错&#xff0c;在此记录一下遇到的几个错误。 1.ERROR 1231 (NO_AUTO_CREATE_USER) 1.1.报错提示 ERROR 1231 (42000…...

Qt 使用QAxObject将QTableView数据导出到Excel表格

这是我记录Qt学习过程的第6篇心得文章&#xff0c;主要是方便自己编写的应用程序导出Excel数据的&#xff0c;走了不少弯路直接上代码。 实现代码&#xff1a; //人员信息导出 ui->pbtn2->setEnabled(false); // 打开文件对话框&#xff0c;选择 excel文件 QString fil…...

fastGpt

参考本地部署FastGPT使用在线大语言模型 1 rockylinx 1 ollama安装 在rockylinux中安装的&#xff0c;ollama由1.5G&#xff0c;还是比较大&#xff0c;所有采用在windows下下载&#xff0c;然后安装的方式&#xff0c;linux安装 tar -C /usr -xzf ollama-linux-amd64.tgz #…...

如何全方位应对服务可用性的挑战

在数字化转型的浪潮中&#xff0c;运维团队正站在企业IT架构的核心位置&#xff0c;面对着前所未有的挑战。服务响应时间和失败率&#xff0c;作为衡量服务质量的重要指标&#xff0c;一直备受关注。然而&#xff0c;在追求这两项指标优化的同时&#xff0c;运维团队还需关注其…...

告别玄学调试:手把手教你用Vivado配置Xilinx SRIO IP核(附完整工程源码)

告别玄学调试&#xff1a;手把手教你用Vivado配置Xilinx SRIO IP核&#xff08;附完整工程源码&#xff09; 在FPGA开发领域&#xff0c;高速串行通信一直是工程师们又爱又恨的技术难点。特别是当项目需要实现芯片间高速数据交互时&#xff0c;Serial RapidIO&#xff08;SRIO…...

如何彻底解决Windows风扇控制难题:Fan Control完整指南

如何彻底解决Windows风扇控制难题&#xff1a;Fan Control完整指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…...

基于 HarmonyOS 6.0 的空气质量监测页面实战:声明式 UI 构建与跨端开发深度解析

基于 HarmonyOS 6.0 的空气质量监测页面实战&#xff1a;声明式 UI 构建与跨端开发深度解析 前言 随着 HarmonyOS 生态不断完善&#xff0c;HarmonyOS 6.0 在分布式能力、ArkUI 声明式开发、跨端协同以及应用性能方面都有了明显提升。相比传统 Android 开发模式&#xff0c;Har…...

向量引擎、DeepSeek V4、GPT Image 2、api key:为什么 Agent 真正落地时,先补的不是模型,而是记忆层

向量引擎、DeepSeek V4、GPT Image 2、api key&#xff1a;为什么 Agent 真正落地时&#xff0c;先补的不是模型&#xff0c;而是记忆层最近这波 AI 的变化&#xff0c;有个很明显的信号。 模型还在继续变强&#xff0c;但讨论重心已经悄悄变了。 以前大家最爱问的是“哪个模型…...

口碑好的柜子定制服务商

在装修和商业展示领域&#xff0c;柜子定制的质量与风格直接影响着整体效果。今天&#xff0c;就来为大家揭开一家口碑超棒的柜子定制服务商——东莞市龙圣展柜装饰有限公司&#xff08;以下简称龙圣展柜&#xff09;的神秘面纱。一、丰富多样的产品服务&#xff0c;满足多元需…...

【限时解密】Midjourney Anthotype印相黄金比例:1:1.618构图×植物色素衰减曲线=不可复制的复古质感

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney Anthotype印相的本质溯源与时代语境 Anthotype&#xff08;植物感光印相&#xff09;是一种源于19世纪的古老摄影工艺&#xff0c;利用植物提取物&#xff08;如甜菜根、黑醋栗或蒲公英花汁…...

3分钟快速解锁B站缓存视频:m4s转MP4的完整教程

3分钟快速解锁B站缓存视频&#xff1a;m4s转MP4的完整教程 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾为B站下架的珍贵视频感到惋惜…...

sed文本处理实战:从基础语法到高阶场景解析

1. 为什么你需要掌握sed&#xff1f; 第一次接触sed时&#xff0c;我也觉得这个命令行工具看起来晦涩难懂。直到有次需要处理一个500MB的日志文件&#xff0c;用文本编辑器直接打开卡死&#xff0c;用Excel根本加载不了&#xff0c;这时候sed只用一行命令就搞定了数据清洗&…...

别再乱调了!AUTOSAR DEM中Debounce参数(步长、阈值)的实战配置指南与避坑

AUTOSAR DEM中Debounce参数实战&#xff1a;从电压过压到通讯超时的精准调优 在汽车电子系统的故障诊断中&#xff0c;误报和漏报就像一对难以调和的矛盾体。我曾见过一个项目因为电压过压检测过于敏感&#xff0c;导致车辆在颠簸路面频繁误报故障&#xff1b;也遇到过通讯超时…...

FPGA与CPLD在数字机顶盒中的关键技术应用

1. 可编程逻辑器件在数字机顶盒中的核心价值 数字机顶盒作为连接广播网络与终端显示设备的关键枢纽&#xff0c;其设计面临三大核心挑战&#xff1a;多标准兼容性、快速功能迭代和成本控制。Xilinx Spartan系列FPGA和CoolRunner CPLD通过硬件可重构特性&#xff0c;为这些挑战提…...