过滤器模式
允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。属于结构型模式,它结合多个标准来获得单一标准。
适用场景
需要在一个集合中按照一定的条件和规则筛选出子集合,可以用过滤器模式。
采用菜鸟教程的例子,这里用C++实现
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
//创建一个Person类,在该类上应用标准。
class Person
{
public:
Person(string tname, string tgender, string tmaritalStatus) { name = tname; gender = tgender; maritalStatus = tmaritalStatus; }
Person(const Person &pson) { name = pson.name; gender = pson.gender; maritalStatus = pson.maritalStatus; }
~Person() {}
string getName() { return name; }
string getGender() { return gender; }
string getMaritalStatus() { return maritalStatus; }
bool operator==(const Person &t1)
{
cout<<name<<" == "<<t1.name<<endl;
if(name==t1.name)
{
return true;
}
else
{
return false;
}
}
private:
string name;
string gender;
string maritalStatus;
};
//为标准Criteria创建一个抽象接口。
class Criteria
{
public:
Criteria() {}
virtual ~Criteria() {}
virtual vector<Person> meetCriteria(vector<Person> &persons) = 0;
static void printPersons(vector<Person> &persons);
};
void Criteria::printPersons(vector<Person> &persons)
{
vector<Person>::iterator it;
for (it = persons.begin(); it != persons.end(); ++it)
{
cout << "Person: ["
<< " name: " << (*it).getName()
<< " gender: " << (*it).getGender()
<< " maritalStatus: " << (*it).getMaritalStatus()
<< " ]" << endl;
}
}
//创建实现了Criteria接口的实体类。
class CriteriaMale :Criteria
{
public:
CriteriaMale() {}
~CriteriaMale() {}
vector<Person> meetCriteria(vector<Person> &persons);
};
vector<Person> CriteriaMale::meetCriteria(vector<Person> &persons)
{
vector<Person>::iterator it;
vector<Person> malePersons;
for (it = persons.begin(); it != persons.end(); ++it)
{
if ((*it).getGender() == "Male")
{
malePersons.push_back(Person((*it)));
}
}
return malePersons;
}
//创建实现了Criteria接口的实体类。
class CriteriaFemale :Criteria
{
public:
CriteriaFemale() {}
~CriteriaFemale() {}
vector<Person> meetCriteria(vector<Person> &persons);
};
vector<Person> CriteriaFemale::meetCriteria(vector<Person> &persons)
{
vector<Person>::iterator it;
vector<Person> femalePersons;
for (it = persons.begin(); it != persons.end(); ++it)
{
if ((*it).getGender() == "Female")
{
femalePersons.push_back(Person((*it)));
}
}
return femalePersons;
}
//创建实现了Criteria接口的实体类。
class CriteriaSingle :Criteria
{
public:
CriteriaSingle() {}
~CriteriaSingle() {}
vector<Person> meetCriteria(vector<Person> &persons);
};
vector<Person> CriteriaSingle::meetCriteria(vector<Person> &persons)
{
vector<Person>::iterator it;
vector<Person> singlePersons;
for (it = persons.begin(); it != persons.end(); ++it)
{
if ((*it).getMaritalStatus() == "Single")
{
singlePersons.push_back(Person((*it)));
}
}
return singlePersons;
}
//创建实现了Criteria接口的实体类。
class AndCriteria :Criteria
{
public:
AndCriteria(Criteria *tcrit1, Criteria *tcrit2) { crit1 = tcrit1; crit2 = tcrit2; }
~AndCriteria() {}
vector<Person> meetCriteria(vector<Person> &persons);
private:
Criteria *crit1;
Criteria *crit2;
};
vector<Person> AndCriteria::meetCriteria(vector<Person> &persons)
{
vector<Person> firstPersons = crit1->meetCriteria(persons);
return crit2->meetCriteria(firstPersons);
}
//创建实现了Criteria接口的实体类。
class OrCriteria :Criteria
{
public:
OrCriteria(Criteria *tcrit1, Criteria *tcrit2) { crit1 = tcrit1; crit2 = tcrit2; }
~OrCriteria() {}
vector<Person> meetCriteria(vector<Person> &persons);
private:
Criteria *crit1;
Criteria *crit2;
};
vector<Person> OrCriteria::meetCriteria(vector<Person> &persons)
{
bool flag=false;
vector<Person> firstPersons = crit1->meetCriteria(persons);
vector<Person> SecondPersons = crit2->meetCriteria(persons);
vector<Person>::iterator yt;
vector<Person>::iterator xt;
for (yt = SecondPersons.begin(); yt != SecondPersons.end(); ++yt)
{
flag=false;
for (xt = firstPersons.begin(); xt != firstPersons.end(); ++xt)
{
if((*xt).getName()==(*yt).getName())
{
flag=true;
break;
}
}
if (!flag)
{
firstPersons.push_back(Person((*yt)));
}
}
return firstPersons;
}
int main()
{
vector<Person> persons;
persons.push_back(Person("Robert", "Male", "Single"));
persons.push_back(Person("John", "Male", "Married"));
persons.push_back(Person("Laura", "Female", "Married"));
persons.push_back(Person("Diana", "Female", "Single"));
persons.push_back(Person("Mike", "Male", "Single"));
persons.push_back(Person("Bobby", "Male", "Single"));
Criteria *male =(Criteria*) new CriteriaMale();
Criteria *female = (Criteria*) new CriteriaFemale();
Criteria *single = (Criteria*) new CriteriaSingle();
Criteria *singleMale = (Criteria*) new AndCriteria(single, male);
Criteria *singleOrFemale = (Criteria*) new OrCriteria(single, female);
cout<<"Males: "<<endl;
vector<Person> t1=male->meetCriteria(persons);
Criteria::printPersons(t1);
cout << "\nFemales: " << endl;
vector<Person> t2=female->meetCriteria(persons);
Criteria::printPersons(t2);
cout << "\nSingle Males: " << endl;
vector<Person> t3=singleMale->meetCriteria(persons);
Criteria::printPersons(t3);
cout << "\nSingle Or Females: " << endl;
vector<Person> t4=singleOrFemale->meetCriteria(persons);
Criteria::printPersons(t4);
delete male;
male=NULL;
delete female;
female=NULL;
delete single;
single=NULL;
delete singleMale;
singleMale=NULL;
delete singleOrFemale;
singleOrFemale=NULL;
}
在visual studio 2015上运行结果: