过滤器模式:又叫标准模式属于结构型模式
基本原理:创建过滤器,过滤出符合标准的对象。
主要流程:
1.准备原料,将对象抽象成有共性的一类
2.根据需求的不同创建各种过滤器
3.依靠过滤器过滤出需要的对象
注意:过滤器是工具,创建的对象是原料
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//创建对象
class Person
{
private:
string name;
string gender;
string maritalStatus;
public:
Person(){}
Person(string name, string gender, string maritalStatus)
{
this->name = name;
this->gender = gender;
this->maritalStatus = maritalStatus;
}
string getName()
{
return name;
}
string getGender()
{
return gender;
}
string getMaritalStatus()
{
return maritalStatus;
}
};
//创建不同的过滤器
class Criteria
{
public:
virtual vector<Person*> meetCriteria(vector<Person*>) = 0;
};
class CriteriaMale : public Criteria
{
public:
vector<Person*> meetCriteria(vector<Person*> person)
{
vector<Person*> malePerson;
for(size_t i = 0; i < person.size(); i++)
{
Person *per = person[i];
if(per->getGender()=="Male")//进行过滤
{
malePerson.push_back(per);
}
}
return malePerson;
}
};
class CriteriaFemale : public Criteria
{
public:
vector<Person*> meetCriteria(vector<Person*> person)
{
vector<Person*> femalePerson;
for(size_t i = 0; i < person.size(); i++)
{
Person *per = person[i];
if(per->getGender()=="Female")//进行过滤
{
femalePerson.push_back(per);
}
}
return femalePerson;
}
};
class CriteriaSingle:public Criteria
{
public:
vector<Person*> meetCriteria(vector<Person*> person)
{
vector<Person*> singlePersons;
for(size_t i = 0; i < person.size(); i++)
{
Person *per = person[i];
if(per->getMaritalStatus()=="Single")//进行过滤
{
singlePersons.push_back(per);
}
}
return singlePersons;
}
};
//同时满足
class AndCriteria:public Criteria
{
private:
Criteria *criteria;
Criteria *otherCriteria;
public:
AndCriteria (Criteria *criteria, Criteria *otherCriteria)
{
this->criteria = criteria;
this->otherCriteria = otherCriteria;
}
vector<Person*> meetCriteria(vector<Person*> person)
{
vector<Person*> firstCriteriaPersons = criteria->meetCriteria(person);
return otherCriteria->meetCriteria(firstCriteriaPersons);
}
};
//满足一个
class OrCriteria:public Criteria
{
private:
Criteria *criteria;
Criteria *otherCriteria;
public:
OrCriteria (Criteria *criteria, Criteria *otherCriteria)
{
this->criteria = criteria;
this->otherCriteria = otherCriteria;
}
vector<Person*> meetCriteria(vector<Person*> person)
{
vector<Person*> firstCriteriaItems = criteria->meetCriteria(person);
vector<Person*> otherCriteriaItems = otherCriteria->meetCriteria(person);
vector<Person*> criteriaItems(firstCriteriaItems);
for(size_t i=0;i<otherCriteriaItems.size();i++)
{
Person* per = otherCriteriaItems[i];
int ishave = 0;
for(size_t j = 0;j<firstCriteriaItems.size();j++)
{
Person *fper = firstCriteriaItems[j];
if(fper->getName() == per->getName())
{
ishave = 1;
break;
}
}
if(ishave == 0)
{
criteriaItems.push_back(per);
}
}
return criteriaItems;
}
};
void printPersons(vector<Person*> person)
{
for(size_t i=0;i<person.size();i++)
{
Person* per = person[i];
cout<<"Person : [ Name : " << per->getName()
<<", Gender : " << per->getGender()
<<", Marital Status : " << per->getMaritalStatus()
<<" ]"<<endl;
}
cout<<endl;
}
int main()
{
vector<Person *> persons;
persons.push_back(new Person("Robert","Male", "Single"));
persons.push_back(new Person("John","Male", "Married"));
persons.push_back(new Person("Laura","Female", "Married"));
persons.push_back(new Person("Diana","Female", "Single"));
persons.push_back(new Person("Mike","Male", "Single"));
persons.push_back(new Person("Bobby","Male", "Single"));
Criteria *male = new CriteriaMale();
cout<<"Males:"<<endl;
printPersons(male->meetCriteria(persons));
Criteria *female = new CriteriaFemale();
cout<<"Females:"<<endl;
printPersons(female->meetCriteria(persons));
Criteria *single = new CriteriaSingle();
cout<<"Single:"<<endl;
printPersons(single->meetCriteria(persons));
Criteria *singleMale = new AndCriteria(single, male);
cout<<"Single Males:"<<endl;
printPersons(singleMale->meetCriteria(persons));
Criteria *singleOrFemale = new OrCriteria(single, female);
cout<<"Single Or Females"<<endl;
printPersons(singleOrFemale->meetCriteria(persons));
return 0;
}
#include <iostream>
using namespace std;
class Data
{
public:
int a;
int b;
Data(){}
Data(int x, int y)
{
a=x;
b=y;
}
};
//创建过滤器
class Criteria
{
public:
int jin;
virtual Data* meetCriteria(Data data[],int len) = 0;
};
class aIsOuShuCriteria:public Criteria
{
public:
Data* meetCriteria(Data data[],int len)
{
Data *OuShu = new Data[5];
jin = 0;
for(int i = 0; i < len; i++)
{
if(data[i].a%2 == 1)
{
OuShu[jin++] = data[i];
}
}
return OuShu;
}
};
void showDataList(Data data[], int len)
{
for(int i = 0; i < len; i++)
{
cout<<"i="<<i<<" a="<<data[i].a<<" b="<<data[i].b<<endl;
}
}
int main()
{
Data data[3] = {Data(1,2),Data(2,3),Data(3,4)};
Criteria *aIsOuShu = new aIsOuShuCriteria();
Data *ouShuList = aIsOuShu->meetCriteria(data,3);
int ouLen = aIsOuShu->jin;
showDataList(ouShuList,ouLen);
return 0;
}