当前位置:   article > 正文

C++设计模式:过滤器模式_c++ filter

c++ filter

过滤器模式

过滤器模式(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、注意区分过滤和拦截的功能差异。

UML结构图

 

代码实现

person.h
构建类 Person,可输出自己的属性,判断是否在一个数组中

  1. #include <string>
  2. #include <vector>
  3. #include <iostream>
  4. using namespace std;
  5. class Person
  6. {
  7. public:
  8. Person(string name, string gender, int age) : name(name), gender(gender), age(age) {}
  9. void printf()
  10. {
  11. cout << "student name: " + name +
  12. ", gender: " + gender +
  13. ", age: " + std::to_string(age) << endl;
  14. }
  15. bool judVec(std::vector<Person*> vec)
  16. {
  17. auto iter = std::find(std::begin(vec), std::end(vec), this);
  18. return (iter == std::end(vec));
  19. }
  20. string getName() { return this->name; }
  21. string getGender() { return this->gender; }
  22. int getAge() { return this->age; }
  23. private:
  24. string name;
  25. string gender;
  26. int age;
  27. };

interface.h
创建抽象类 - 过滤器;创建实体类 - 过滤器、男性过滤器、女性过滤器、年龄过滤器
男性和年龄过滤器、女性或年龄过滤器

  1. #include "person.h"
  2. #include <algorithm>
  3. class Criteria //基类-过滤器
  4. {
  5. public:
  6. Criteria() {}
  7. virtual ~Criteria() {}
  8. virtual std::vector<Person *> filter(std::vector<Person *> vector) = 0;
  9. };
  10. class MaleCriteria: public Criteria //子类-男性过滤器
  11. {
  12. public:
  13. std::vector<Person *> filter(std::vector<Person *> vector)
  14. {
  15. std::vector<Person *> result;
  16. for(size_t i = 0; i < vector.size(); i++)
  17. {
  18. if(vector.at(i)->getGender() == "male")
  19. {
  20. result.push_back(vector.at(i));
  21. }
  22. }
  23. return result;
  24. }
  25. };
  26. class FemaleCriteria: public Criteria //子类-女性过滤器
  27. {
  28. public:
  29. std::vector<Person *> filter(std::vector<Person *> vector)
  30. {
  31. std::vector<Person *> result;
  32. for(size_t i = 0; i < vector.size(); i++)
  33. {
  34. if(vector.at(i)->getGender() == "female")
  35. {
  36. result.push_back(vector.at(i));
  37. }
  38. }
  39. return result;
  40. }
  41. };
  42. class AgeCriteria: public Criteria //子类-年龄过滤器
  43. {
  44. public:
  45. std::vector<Person *> filter(std::vector<Person *> vector)
  46. {
  47. std::vector<Person *> result;
  48. for(size_t i = 0; i < vector.size(); i++)
  49. {
  50. if(vector.at(i)->getAge() > 18) {
  51. result.push_back(vector.at(i));
  52. }
  53. }
  54. return result;
  55. }
  56. };
  57. class AndCriteria: public Criteria //子类-与 && 过滤器
  58. {
  59. public:
  60. AndCriteria(Criteria *firstCriteria, Criteria *secondCriteria): firstCriteria(firstCriteria), secondCriteria(secondCriteria) {}
  61. std::vector<Person *> filter(std::vector<Person *> vector)
  62. {
  63. std::vector<Person *> firstvector = firstCriteria->filter(vector);
  64. return secondCriteria->filter(firstvector);
  65. }
  66. private:
  67. Criteria *firstCriteria;
  68. Criteria *secondCriteria;
  69. };
  70. class OrCriteria: public Criteria //子类- 或 || 过滤器
  71. {
  72. public:
  73. OrCriteria(Criteria *firstCriteria, Criteria *secondCriteria) : firstCriteria(firstCriteria), secondCriteria(secondCriteria) {}
  74. std::vector<Person *> filter(std::vector<Person *> vector)
  75. {
  76. std::vector<Person *> firstvector = firstCriteria->filter(vector);
  77. std::vector<Person *> secondvector = secondCriteria->filter(vector);
  78. for(auto it: firstvector)
  79. {
  80. if (it->judVec(secondvector))
  81. {
  82. secondvector.push_back(it);
  83. }
  84. }
  85. return secondvector;
  86. }
  87. private:
  88. Criteria *firstCriteria;
  89. Criteria *secondCriteria;
  90. };

main.cpp
实例应用 - 根据不同的过滤规则获取不同的数据

  1. #include "interface.h"
  2. int main()
  3. {
  4. std::vector<Person *> vector;
  5. Person *stu1 = new Person("Billy", "male", 25);
  6. Person *stu2 = new Person("Kitty", "female", 24);
  7. Person *stu3 = new Person("Alice", "female", 23);
  8. Person *stu4 = new Person("Ben", "male", 17);
  9. Person *stu5 = new Person("Jeason", "male", 18);
  10. Person *stu6 = new Person("Jon", "male", 20);
  11. Person *stu7 = new Person("Miss", "female", 13);
  12. Person *stu8 = new Person("Abbey", "female", 14);
  13. vector.push_back(stu1);
  14. vector.push_back(stu2);
  15. vector.push_back(stu3);
  16. vector.push_back(stu4);
  17. vector.push_back(stu5);
  18. vector.push_back(stu6);
  19. vector.push_back(stu7);
  20. vector.push_back(stu8);
  21. Criteria *maleCriteria = new MaleCriteria();
  22. Criteria *femaleCriteria = new FemaleCriteria();
  23. Criteria *ageCriteria = new AgeCriteria();
  24. Criteria *andCriteria = new AndCriteria(maleCriteria, ageCriteria);
  25. Criteria *orCriteria = new OrCriteria(femaleCriteria, ageCriteria);
  26. std::vector<Person *> malevector = maleCriteria->filter(vector);
  27. std::vector<Person *> femalevector = femaleCriteria->filter(vector);
  28. std::vector<Person *> agevector = ageCriteria->filter(vector);
  29. std::vector<Person *> andvector = andCriteria->filter(vector);
  30. std::vector<Person *> orvector = orCriteria->filter(vector);
  31. cout << "male:" << endl;
  32. for(auto it: malevector)
  33. {
  34. it->printf();
  35. }
  36. cout << endl << "female:" << endl;
  37. for(auto it: femalevector)
  38. {
  39. it->printf();
  40. }
  41. cout << endl << "age > 18:" << endl;
  42. for(auto it: agevector)
  43. {
  44. it->printf();
  45. }
  46. cout << endl << "male and age > 18:" << endl;
  47. for(auto it: andvector)
  48. {
  49. it->printf();
  50. }
  51. cout << endl << "female or age > 18:" << endl;
  52. for(auto it: orvector)
  53. {
  54. it->printf();
  55. }
  56. return 0;
  57. }
  58. 运行结果:
  59. male:
  60. student name: Billy, gender: male, age: 25
  61. student name: Ben, gender: male, age: 17
  62. student name: Jeason, gender: male, age: 18
  63. student name: Jon, gender: male, age: 20
  64. female:
  65. student name: Kitty, gender: female, age: 24
  66. student name: Alice, gender: female, age: 23
  67. student name: Miss, gender: female, age: 13
  68. student name: Abbey, gender: female, age: 14
  69. age > 18:
  70. student name: Billy, gender: male, age: 25
  71. student name: Kitty, gender: female, age: 24
  72. student name: Alice, gender: female, age: 23
  73. student name: Jon, gender: male, age: 20
  74. male and age > 18:
  75. student name: Billy, gender: male, age: 25
  76. student name: Jon, gender: male, age: 20
  77. female or age > 18:
  78. student name: Billy, gender: male, age: 25
  79. student name: Kitty, gender: female, age: 24
  80. student name: Alice, gender: female, age: 23
  81. student name: Jon, gender: male, age: 20
  82. student name: Miss, gender: female, age: 13
  83. student name: Abbey, gender: female, age: 14

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/482053
推荐阅读
相关标签
  

闽ICP备14008679号