当前位置:   article > 正文

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

c++ filter

一、简介

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

二、过滤器模式实例

实例介绍

假如某地政府为了帮助无业人员就业,统计了一批36岁市民的就业情况。政府拿到名单后,过滤出无业人员帮助就业。

为了完成这个项目,我们需要建造:

1)人员信息类 Person;

2)标准抽象类 Criteria,提供按照某标准过滤的接口 meetCriteria;

3)标准具体类,继承Criteria,定义不同的过滤标准,实现meetCriteria接口;

代码实现

1)人员信息类 Person

  1. class Person
  2. {
  3. public:
  4. Person(string name, int age, string gdr, string work)
  5. :_name(name)
  6. , _age(age)
  7. , _gender(gdr)
  8. , _work(work) {}
  9. ~Person() {}
  10. void show()
  11. {
  12. cout << "**********档案记录***********" << endl;
  13. cout << "姓名:" <<_name << endl;
  14. cout << "性别:" << _gender << endl;
  15. cout << "工作:" << _work << endl;
  16. }
  17. public:
  18. string _name; //姓名
  19. int _age; //年龄
  20. string _gender; //性别
  21. string _work; //工作
  22. };

2)标准抽象类 Criteria,提供按照某标准过滤的接口 meetCriteria;

  1. class Criteria
  2. {
  3. public:
  4. //定义过滤器接口:按照某一标准过滤出对象指针列表,这一标准由继承了Criteria的实体类具体定义
  5. virtual vector<Person*> meetCriteria(vector<Person*> all) = 0;
  6. };

3)标准具体类,继承Criteria,定义不同的过滤标准,实现meetCriteria接口;

其中定义了过滤女性男性、和无业者的类,并且提供了这两种可以提供组合2个过滤器服务的过滤器。

  1. //女性过滤器
  2. class CriteriaFemale : public Criteria
  3. {
  4. vector<Person*> meetCriteria(vector<Person*> allPerson)
  5. {
  6. vector<Person*> per;
  7. for (auto it: allPerson)
  8. {
  9. if ("女" == it->_gender)
  10. {
  11. per.push_back(it);
  12. }
  13. }
  14. return per;
  15. }
  16. };
  17. //男性过滤器
  18. class CriteriaMale : public Criteria
  19. {
  20. vector<Person*> meetCriteria(vector<Person*> allPerson)
  21. {
  22. vector<Person*> per;
  23. for (auto it : allPerson)
  24. {
  25. if ("男" == it->_gender)
  26. {
  27. per.push_back(it);
  28. }
  29. }
  30. return per;
  31. }
  32. };
  33. //无业者过滤器
  34. class CriteriaUnemployed : public Criteria
  35. {
  36. vector<Person*> meetCriteria(vector<Person*> allPerson)
  37. {
  38. vector<Person*> per;
  39. for (auto it : allPerson)
  40. {
  41. if ("" == it->_work)
  42. {
  43. per.push_back(it);
  44. }
  45. }
  46. return per;
  47. }
  48. };
  49. //逻辑关系:与 的过滤器
  50. class AndCriteria :public Criteria
  51. {
  52. public:
  53. AndCriteria(Criteria *p1, Criteria *p2)
  54. :_pCriteria1(p1)
  55. ,_pCriteria2(p2) {}
  56. ~AndCriteria()
  57. {
  58. if (nullptr != _pCriteria1)
  59. {
  60. delete _pCriteria1;
  61. _pCriteria1 = nullptr;
  62. }
  63. if (nullptr != _pCriteria2)
  64. {
  65. delete _pCriteria2;
  66. _pCriteria2 = nullptr;
  67. }
  68. }
  69. vector<Person*> meetCriteria(vector<Person*> allPerson)
  70. {
  71. vector<Person*> per;
  72. if (nullptr == _pCriteria1 || nullptr == _pCriteria2)
  73. {
  74. return per;
  75. }
  76. //先以标准1过滤
  77. per = _pCriteria1->meetCriteria(allPerson);
  78. //再以标准2过滤标准1的结果
  79. per = _pCriteria2->meetCriteria(per);
  80. return per;
  81. }
  82. private:
  83. Criteria *_pCriteria1;
  84. Criteria *_pCriteria2;
  85. };
  86. //逻辑关系:或 的过滤器
  87. class OrCriteria :public Criteria
  88. {
  89. public:
  90. OrCriteria(Criteria *p1, Criteria *p2)
  91. :_pCriteria1(p1)
  92. , _pCriteria2(p2) {}
  93. ~OrCriteria()
  94. {
  95. if (nullptr != _pCriteria1)
  96. {
  97. delete _pCriteria1;
  98. _pCriteria1 = nullptr;
  99. }
  100. if (nullptr != _pCriteria2)
  101. {
  102. delete _pCriteria2;
  103. _pCriteria2 = nullptr;
  104. }
  105. }
  106. vector<Person*> meetCriteria(vector<Person*> allPerson)
  107. {
  108. vector<Person*> per;
  109. if (nullptr == _pCriteria1 || nullptr == _pCriteria2)
  110. {
  111. return per;
  112. }
  113. //以标准1和标准2分别过滤整个样本
  114. per = _pCriteria1->meetCriteria(allPerson);
  115. vector<Person*> per2;
  116. per2 = _pCriteria2->meetCriteria(allPerson);
  117. //合并两个过滤结果
  118. for (auto it:per2)
  119. {
  120. per.push_back(it);
  121. }
  122. return per;
  123. }
  124. private:
  125. Criteria *_pCriteria1;
  126. Criteria *_pCriteria2;
  127. };

4)使用

  1. int main(int argc, char *argv[])
  2. {
  3. Person p1("A", 36, "男", "法官");
  4. Person p2("B", 36, "男", "教师");
  5. Person p3("C", 36, "男", "农民");
  6. Person p4("D", 36, "男", "");
  7. Person p5("E", 36, "男", "");
  8. Person p6("F", 36, "男", "");
  9. Person p7("G", 36, "女", "保洁");
  10. Person p8("H", 36, "女", "医生");
  11. Person p9("J", 36, "女", "工程师");
  12. Person p10("K", 36, "女", "");
  13. Person p11("L", 36, "女", "");
  14. vector< Person*> allPerson;
  15. allPerson.push_back(&p1);
  16. allPerson.push_back(&p2);
  17. allPerson.push_back(&p3);
  18. allPerson.push_back(&p4);
  19. allPerson.push_back(&p5);
  20. allPerson.push_back(&p6);
  21. allPerson.push_back(&p7);
  22. allPerson.push_back(&p8);
  23. allPerson.push_back(&p9);
  24. allPerson.push_back(&p10);
  25. allPerson.push_back(&p11);
  26. //女性过滤器
  27. CriteriaFemale *female = new CriteriaFemale();
  28. //男性过滤器
  29. CriteriaMale *male = new CriteriaMale();
  30. //无业过滤器
  31. CriteriaUnemployed *unemployed = new CriteriaUnemployed();
  32. //女性无业者列表
  33. AndCriteria *and1 = new AndCriteria(female, unemployed);
  34. vector< Person*> per = and1->meetCriteria(allPerson);
  35. cout << "女性无业者列表 :" << endl;
  36. for (auto it : per)
  37. {
  38. it->show();
  39. }
  40. //男性无业者列表
  41. AndCriteria *and2 = new AndCriteria(male, unemployed);
  42. per = and2->meetCriteria(allPerson);
  43. cout << endl << "男性无业者列表 :" << endl;
  44. for (auto it : per)
  45. {
  46. it->show();
  47. }
  48. system("pause");
  49. return 0;
  50. }

5)输出

 

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

闽ICP备14008679号