赞
踩
过滤器模式(Filter Pattern),又叫标准模式(Criteria Pattern),是一种结构型模式,通过结合多个标准来获得单一标准。
这种设计模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
当你在一个很庞大的数据量中查找一些东西时,可以使用过滤器模式制定过滤规则,然后根据指定的标准进行过滤,得到符合条件的数据。
优点:
1、体现了各功能模块的“黑盘”特性及高内聚、低耦合的特点。
2、可以将整个系统的输入,输出行为看成是多个过滤器行为的简单合成。
3、支持软件功能模块的重用。
4、便于系统维护:新的过滤器可以添加到现有系统中来,旧的可以由改进的过滤器替换。
5、支持某些特定的分析,如吞吐量计算、死锁检测等。
6、支持并行操作,每个过滤器可以作为一个单独的任务完成。
缺点:
1、通常导致系统处理过程的成批操作。
2、需要设计者协调两个相对独立但又存在关系的数据流。
3、可能需要每个过滤器自己完成数据解析和合成工作(如加密和解密),从而导致系统性能下降,并增加了过滤器具体实现的复杂性。
1、构建过滤规则时不要太繁琐。
2、注意区分过滤和拦截的功能差异。
person.h
构建类 Person,可输出自己的属性,判断是否在一个数组中
- #include <string>
- #include <vector>
- #include <iostream>
- using namespace std;
-
- class Person
- {
- public:
- Person(string name, string gender, int age) : name(name), gender(gender), age(age) {}
-
- void printf()
- {
- cout << "student name: " + name +
- ", gender: " + gender +
- ", age: " + std::to_string(age) << endl;
- }
-
- bool judVec(std::vector<Person*> vec)
- {
- auto iter = std::find(std::begin(vec), std::end(vec), this);
- return (iter == std::end(vec));
- }
-
- string getName() { return this->name; }
-
- string getGender() { return this->gender; }
-
- int getAge() { return this->age; }
-
- private:
- string name;
- string gender;
- int age;
- };

interface.h
创建抽象类 - 过滤器;创建实体类 - 过滤器、男性过滤器、女性过滤器、年龄过滤器
男性和年龄过滤器、女性或年龄过滤器
- #include "person.h"
- #include <algorithm>
-
- class Criteria //基类-过滤器
- {
- public:
- Criteria() {}
- virtual ~Criteria() {}
-
- virtual std::vector<Person *> filter(std::vector<Person *> vector) = 0;
- };
-
- class MaleCriteria: public Criteria //子类-男性过滤器
- {
- public:
- std::vector<Person *> filter(std::vector<Person *> vector)
- {
- std::vector<Person *> result;
-
- for(size_t i = 0; i < vector.size(); i++)
- {
- if(vector.at(i)->getGender() == "male")
- {
- result.push_back(vector.at(i));
- }
- }
-
- return result;
- }
- };
-
- class FemaleCriteria: public Criteria //子类-女性过滤器
- {
- public:
- std::vector<Person *> filter(std::vector<Person *> vector)
- {
- std::vector<Person *> result;
-
- for(size_t i = 0; i < vector.size(); i++)
- {
- if(vector.at(i)->getGender() == "female")
- {
- result.push_back(vector.at(i));
- }
- }
-
- return result;
- }
- };
-
- class AgeCriteria: public Criteria //子类-年龄过滤器
- {
- public:
- std::vector<Person *> filter(std::vector<Person *> vector)
- {
- std::vector<Person *> result;
-
- for(size_t i = 0; i < vector.size(); i++)
- {
- if(vector.at(i)->getAge() > 18) {
- result.push_back(vector.at(i));
- }
- }
-
- return result;
- }
- };
-
- class AndCriteria: public Criteria //子类-与 && 过滤器
- {
- public:
- AndCriteria(Criteria *firstCriteria, Criteria *secondCriteria): firstCriteria(firstCriteria), secondCriteria(secondCriteria) {}
-
- std::vector<Person *> filter(std::vector<Person *> vector)
- {
- std::vector<Person *> firstvector = firstCriteria->filter(vector);
- return secondCriteria->filter(firstvector);
- }
-
- private:
- Criteria *firstCriteria;
- Criteria *secondCriteria;
- };
-
- class OrCriteria: public Criteria //子类- 或 || 过滤器
- {
- public:
- OrCriteria(Criteria *firstCriteria, Criteria *secondCriteria) : firstCriteria(firstCriteria), secondCriteria(secondCriteria) {}
-
- std::vector<Person *> filter(std::vector<Person *> vector)
- {
- std::vector<Person *> firstvector = firstCriteria->filter(vector);
- std::vector<Person *> secondvector = secondCriteria->filter(vector);
-
- for(auto it: firstvector)
- {
- if (it->judVec(secondvector))
- {
- secondvector.push_back(it);
- }
- }
-
- return secondvector;
- }
-
- private:
- Criteria *firstCriteria;
- Criteria *secondCriteria;
- };

main.cpp
实例应用 - 根据不同的过滤规则获取不同的数据
- #include "interface.h"
-
- int main()
- {
- std::vector<Person *> vector;
- Person *stu1 = new Person("Billy", "male", 25);
- Person *stu2 = new Person("Kitty", "female", 24);
- Person *stu3 = new Person("Alice", "female", 23);
- Person *stu4 = new Person("Ben", "male", 17);
- Person *stu5 = new Person("Jeason", "male", 18);
- Person *stu6 = new Person("Jon", "male", 20);
- Person *stu7 = new Person("Miss", "female", 13);
- Person *stu8 = new Person("Abbey", "female", 14);
-
- vector.push_back(stu1);
- vector.push_back(stu2);
- vector.push_back(stu3);
- vector.push_back(stu4);
- vector.push_back(stu5);
- vector.push_back(stu6);
- vector.push_back(stu7);
- vector.push_back(stu8);
-
- Criteria *maleCriteria = new MaleCriteria();
- Criteria *femaleCriteria = new FemaleCriteria();
- Criteria *ageCriteria = new AgeCriteria();
- Criteria *andCriteria = new AndCriteria(maleCriteria, ageCriteria);
- Criteria *orCriteria = new OrCriteria(femaleCriteria, ageCriteria);
-
- std::vector<Person *> malevector = maleCriteria->filter(vector);
- std::vector<Person *> femalevector = femaleCriteria->filter(vector);
- std::vector<Person *> agevector = ageCriteria->filter(vector);
- std::vector<Person *> andvector = andCriteria->filter(vector);
- std::vector<Person *> orvector = orCriteria->filter(vector);
-
- cout << "male:" << endl;
- for(auto it: malevector)
- {
- it->printf();
- }
-
- cout << endl << "female:" << endl;
- for(auto it: femalevector)
- {
- it->printf();
- }
-
- cout << endl << "age > 18:" << endl;
- for(auto it: agevector)
- {
- it->printf();
- }
-
- cout << endl << "male and age > 18:" << endl;
- for(auto it: andvector)
- {
- it->printf();
- }
-
- cout << endl << "female or age > 18:" << endl;
- for(auto it: orvector)
- {
- it->printf();
- }
-
- return 0;
- }
-
- 运行结果:
- male:
- student name: Billy, gender: male, age: 25
- student name: Ben, gender: male, age: 17
- student name: Jeason, gender: male, age: 18
- student name: Jon, gender: male, age: 20
-
- female:
- student name: Kitty, gender: female, age: 24
- student name: Alice, gender: female, age: 23
- student name: Miss, gender: female, age: 13
- student name: Abbey, gender: female, age: 14
-
- age > 18:
- student name: Billy, gender: male, age: 25
- student name: Kitty, gender: female, age: 24
- student name: Alice, gender: female, age: 23
- student name: Jon, gender: male, age: 20
-
- male and age > 18:
- student name: Billy, gender: male, age: 25
- student name: Jon, gender: male, age: 20
-
- female or age > 18:
- student name: Billy, gender: male, age: 25
- student name: Kitty, gender: female, age: 24
- student name: Alice, gender: female, age: 23
- student name: Jon, gender: male, age: 20
- student name: Miss, gender: female, age: 13
- student name: Abbey, gender: female, age: 14

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。