(二)结构型模式:3、过滤器模式(Filter、Criteria Pattern)(C++示例)

news/2024/9/8 4:06:05/

目录

1、过滤器模式(Filter、Criteria Pattern)含义

2、过滤器模式应用场景

3、过滤器模式主要几个关键角色

4、C++实现过滤器模式的示例


1、过滤器模式(Filter、Criteria Pattern)含义

(1)过滤器模式是一种结构型设计模式,它通过使用不同的标准(过滤器)来筛选出符合条件的对象。

(2)该模式将过滤器和对象进行解耦,使得它们可以独立变化而互不影响。

2、过滤器模式应用场景

(1)数据筛选和过滤:当需要从一个数据集合中筛选出符合特定条件的数据时,可以使用过滤器模式。例如,在电子商务网站上根据价格、品牌、评分等条件对商品进行筛选。

(2)数据转换和处理:当需要对一组数据进行转换或处理,并且只关注满足特定条件的数据时,可以使用过滤器模式。例如,在一个日志系统中,根据日志级别对日志进行过滤和处理。

(3)用户权限控制:当需要根据用户的角色、权限或其他属性来限制其访问某些资源或执行某些操作时,可以使用过滤器模式。例如,在一个Web应用程序中,根据用户的身份和权限来过滤和控制页面的访问。

(4)事件处理和触发:当需要根据特定条件触发或处理事件时,可以使用过滤器模式。例如,在一个游戏中,根据玩家的行为和状态来触发不同的游戏事件。

(5)输入验证和过滤:当需要对用户输入进行验证和过滤,以确保输入的合法性和安全性时,可以使用过滤器模式。例如,在一个表单提交过程中,对用户输入的数据进行验证和过滤,防止恶意代码注入或非法输入。

总的来说,过滤器模式适用于需要根据特定条件对对象进行筛选、转换或处理的场景。它可以提高代码的可复用性和可扩展性,并将过滤逻辑与目标对象解耦,使得它们可以独立变化。

3、过滤器模式主要几个关键角色

在过滤器模式中,有以下几个关键角色:

(1)过滤器接口(Filter Interface):定义了过滤器的基本方法,通常包括一个用于筛选对象的过滤方法。

(2)具体过滤器(Concrete Filters):实现了过滤器接口,根据特定的标准对对象进行筛选。

(3)目标对象(Target Object):需要被筛选的对象集合。

(4)过滤器管理器(Filter Manager):负责管理和应用过滤器,以便对目标对象进行筛选。

4、C++实现过滤器模式的示例


#include <iostream>
#include <vector>// 目标对象
class Person 
{
public:std::string name;int age;Person(const std::string& name, int age) : name(name), age(age) {}
};// 过滤器接口
class Filter 
{
public:virtual bool filter(const Person& person) const = 0;
};// 具体过滤器:年龄过滤器
class AgeFilter : public Filter 
{
public:bool filter(const Person& person) const override {return person.age >= 18; // 只筛选年龄大于等于18岁的人}
};// 过滤器管理器
class FilterManager 
{
private:std::vector<Filter*> filters;public:void addFilter(Filter* filter) {filters.push_back(filter);}std::vector<Person> applyFilters(const std::vector<Person>& people) const {std::vector<Person> filteredPeople;for (const auto& person : people) {bool passAllFilters = true;for (const auto& filter : filters) {if (!filter->filter(person)){passAllFilters = false;break;}}if (passAllFilters) {filteredPeople.push_back(person);}}return filteredPeople;}
};int main() 
{// 创建目标对象集合std::vector<Person> people = {Person("Alice", 25),Person("Bob", 17),Person("Charlie", 30),Person("David", 20)};// 创建过滤器管理器并添加过滤器FilterManager filterManager;filterManager.addFilter(new AgeFilter());// 应用过滤器并输出结果std::vector<Person> filteredPeople = filterManager.applyFilters(people);for (const auto& person : filteredPeople) {std::cout << "Name: " << person.name << ", Age: " << person.age << std::endl;}return 0;
}

在上述示例中,我们定义了一个Person类作为目标对象,实现了一个AgeFilter作为具体过滤器,并创建了一个FilterManager来管理和应用过滤器。通过添加过滤器并调用applyFilters方法,我们可以对目标对象进行筛选,并输出符合条件的结果。


http://www.ppmy.cn/news/1033236.html

相关文章

2016年,进了百度

昨在深圳出差&#xff0c;与微信里的朋友吃了个便饭&#xff0c;他是今年四月份加的我微信&#xff08;gaoyang677&#xff09;&#xff0c;他的经历很有意思&#xff0c;经他许可&#xff0c;分享给大家。 2012年时候&#xff0c;他大学毕业来到深圳&#xff0c;进了厂子&…

WebRTC | ICE详解

目录 一、Candidate种类与优先级 二、ICE策略 1. iceServers 2. iceTransportPolicy 三、P2P连接 1.Nat类型 &#xff08;1&#xff09;完全锥型NAT &#xff08;2&#xff09;IP限制锥型NAT &#xff08;3&#xff09;端口限制锥型NAT &#xff08;4&#xff09;对称…

比例电磁铁控制放大器

GP63系列比例电磁铁应用于电液比例控制系统中&#xff0c;与比例控制放大器配套使用共同控制力士(REXROTH)型十通径螺纹比例阀。在额定行程及额定电流范围内&#xff0c;其输出力与输入电流成比例&#xff0c;通过内置反力弹簧&#xff0c;改变了输出力的特性&#xff0c;使系统…

Recyclerview单条拖拽ItemTouchHelper仿微信下拉小程序删除

主要借鉴这位博主写的博客&#xff0c;很详细仿微信朋友圈发表图片拖拽和删除功能_android 发布朋友圈拖动_天兰之珠的博客-CSDN博客 注意注意&#xff1a;自己的布局&#xff0c;需要滑动的Recyclerview的父布局一定要是全屏的&#xff0c;可以自己摸索一下就知道需要全局了 …

linux系统服务学习(三)远程管理SSH服务

文章目录 远程管理SSH服务一、搭建SSH服务1、关闭防火墙与SELinux2、配置yum源3、openssh软件的安装4、查看并修改ssh服务端的配置文件5、sshd服务管理 二、SSH服务任务解决方案1、创建用户并授权第一步&#xff1a;创建用户与用户组&#xff08;html前端组&#xff0c;tom与je…

ListUtils中筛选数据方式select

ListUtils中筛选数据方式select 用法说明 /*** Selects all elements from input collection which match the given* predicate into an output list.* 从给出的集合中筛选符合对应断言的数据&#xff0c;最终汇总一个新的集合。* <p>* A <code>null</code>…

财务人员学python有意义吗,财务会python好找工作吗

这篇文章主要介绍了财务方面python需要什么水平&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 财务是一个比较特殊的工作岗位&#xff0c;每天需要接触各种各样的数据&#x…

Unity ARFoundation 配置工程 (Android)

注意&#xff1a; 1、AR Core是Google的产品&#xff0c;因为谷歌制裁华为&#xff0c;所以 有些 华为机可能不支持AR Core的软件&#xff1b; 2、手机在设置里搜索Google Play&#xff0c;看看是否已经安装上了&#xff0c;如果没有装此服务&#xff0c;去商城里搜索Google Pl…

wireshark过滤条件

当你使用Wireshark进行网络数据包分析时&#xff0c;可以使用过滤条件来筛选出你感兴趣的数据包进行观察和分析。 Wireshark支持各种过滤条件&#xff0c;可以根据协议、IP地址、端口和其他特定的网络参数进行过滤。下面是一些常用的Wireshark过滤条件及其组合使用方法的详细介…

QT学习方法

1 .类的学习方法 第一步:从UI文件中,找到界面的类—QMainWindow第二步:在Qt Creator工具中,找到“帮助”按钮,进入到帮助菜单界面,在选择"索引",在Look for:输入类名,找到类名,双击条目中的类名,在右侧会显示出来类的详细内容第三步:在右侧,可根据内容目录…

Springboot项目启动后按顺序加载自定义类 (demo)

1. 实现ApplicationRunner接口, 重写run方法 import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; import org.springframewor…

什么是JavaScript中的柯里化(Currying)和偏函数应用(Partial Application)?它们在JavaScript中有哪些应用场景?

1、什么是JavaScript中的柯里化(Currying)和偏函数应用(Partial Application)&#xff1f;它们在JavaScript中有哪些应用场景&#xff1f; 柯里化&#xff08;Currying&#xff09;和偏函数应用&#xff08;Partial Application&#xff09;是函数式编程中的两个重要概念&…

费曼学习法

费曼学习法 费曼学习法&#xff08;Feynman Technique&#xff09;是一种学习和理解复杂概念的方法&#xff0c;以理查德费曼&#xff08;Richard Feynman&#xff09;这位著名的理论物理学家命名。该方法的核心思想是通过将学习内容简化并用自己的话解释给别人&#xff0c;来…

安装Linux操作系统CentOS 6详细图文步骤

为满足业务对Linux操作系统部署的要求&#xff0c;本文档主要提供CentOS 6操作系统的最小化安装和基本配置, 安装本系统建议最少1GB内存和2GB磁盘空间。 1、 使用光盘或者挂载ISO镜像&#xff0c;在出现如下图形界面时选择【Install or upgrade an existing system】并按Ent…

应急响应-钓鱼邮件的处理思路溯源及其反制

0x00 钓鱼邮件的危害 1.窃取用户敏感信息&#xff0c;制作虚假网址&#xff0c;诱导用户输入敏感的账户信息后记录 2.携带病毒木马程序&#xff0c;诱导安装&#xff0c;使电脑中病毒木马等 3.挖矿病毒的传输&#xff0c;勒索病毒的传输等等 0x01 有指纹的钓鱼邮件的溯源处理…

直播源码异步处理技术:应对处理大量用户请求的挑战

在网络技术的快速发展背景下&#xff0c;直播源码平台已经成为了人们社交娱乐的重要工具&#xff0c;直播源码平台的用户会在平台内进行观看直播、短视频&#xff0c;与其他用户进行交流、交谈。由于直播源码平台用户数量的逐日增加&#xff0c;使得直播源码平台每天要应对、处…

菜单和内容滚动的联动原理及代码

之前写代码有个需求&#xff1a;左侧是一个菜单&#xff0c;右边是内容&#xff0c;点击左侧菜单右边内容滚动到对应位置&#xff0c;右边内容滚动到某位置时&#xff0c;左侧菜单也会选中对应的菜单项。UI如下&#xff1a;这是大多网站的移动端都会有的需求。 解决方案一&…

基于SpringBoot和Freemarker的页面静态化

页面静态化能够缓轻数据库的压力&#xff0c;还能提高页面的并发能力&#xff0c;但是网页静态化是比较适合大规模且相对变化不太频繁的数据。 页面静态化在实际应用中还是比较常见的&#xff0c;比如博客详情页、新闻网站或者文章类网站等等。这类数据变化不频繁比较适合静态…

智头条|DFM-2大模型吹热智能家居,360安全云正式发布

行业动态 DFM-2大模型吹热智能家居 近期,思必驰行业语言计算大模型DFM-2正式发布,也带来了人机交互能力的提升和优秀的技术落地能力。DFM-2大模型与DUI平台结合推出DUI2.0,完成了对话式AI全链路技术的升级,推进深度产业应用。在智能家居领域,目前思必驰已与海信、长虹美菱、老…

东方晶源亮相第十一届半导体设备年会,共话发展“芯”机遇

8月11日&#xff0c;以“协力同芯抢机遇&#xff0c;集成创新造设备”为主题的第十一届&#xff08;2023年&#xff09;中国电子专用设备工业协会半导体设备年会暨产业链合作论坛&#xff08;CSEAC&#xff09;在无锡太湖国际博览中心圆满闭幕。为期3天的CSEAC&#xff0c;通过…