一、源代码:
#include<iostream>
#include<memory>
#include<list>
#include<algorithm>
using namespace std;
class Person
{
public:
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 getMaritalStstus()
{
return _maritalStatus;
}
friend bool operator==(const Person& a,const Person& b)
{
if(a._gender==b._gender&&a._name==b._name&&a._maritalStatus==b._maritalStatus)
return true;
else
return false;
}
private:
string _name;
string _gender;
string _maritalStatus;
};
class Criteria
{
public:
virtual shared_ptr<list<Person>> meetCriteria(shared_ptr<list<Person>> persons) = 0;
virtual ~Criteria() = default;
};
class CriteriaMale:public Criteria
{
virtual shared_ptr<list<Person>> meetCriteria(shared_ptr<list<Person>> persons) override
{
shared_ptr<list<Person>> malePerson = make_shared<list<Person>>();
for(auto& person:*persons)
{
if(person.getGender() == "male")
{
malePerson->push_back(person);
}
}
return malePerson;
}
};
class CriteriaFemale:public Criteria
{
virtual shared_ptr<list<Person>> meetCriteria(shared_ptr<list<Person>> persons) override
{
shared_ptr<list<Person>> femalePerson = make_shared<list<Person>>();
for(auto& person:*persons)
{
if(person.getGender() == "female")
{
femalePerson->push_back(person);
}
}
return femalePerson;
}
};
class CriteriaSingle:public Criteria
{
virtual shared_ptr<list<Person>> meetCriteria(shared_ptr<list<Person>> persons) override
{
shared_ptr<list<Person>> singlePerson = make_shared<list<Person>>();
for(auto& person:*persons)
{
if(person.getMaritalStstus() == "single")
{
singlePerson->push_back(person);
}
}
return singlePerson;
}
};
class AndCriteria:public Criteria
{
public:
AndCriteria(shared_ptr<Criteria> criteria,shared_ptr<Criteria> othercriteria)
{
this->_criteria = criteria;
this->_othercriteria = othercriteria;
}
virtual shared_ptr<list<Person>> meetCriteria(shared_ptr<list<Person>> persons) override
{
shared_ptr<list<Person>> firstCriteria = _criteria->meetCriteria(persons);
return _othercriteria->meetCriteria(firstCriteria);
}
private:
shared_ptr<Criteria> _criteria;
shared_ptr<Criteria> _othercriteria;
};
class OrCriteria:public Criteria
{
public:
OrCriteria(shared_ptr<Criteria> criteria,shared_ptr<Criteria> othercriteria)
{
this->_criteria = criteria;
this->_othercriteria = othercriteria;
}
virtual shared_ptr<list<Person>> meetCriteria(shared_ptr<list<Person>> persons) override
{
shared_ptr<list<Person>> firstCriteriaItems = _criteria->meetCriteria(persons);
shared_ptr<list<Person>> otherCriteriaItems = _othercriteria->meetCriteria(persons);
for(auto& person:*otherCriteriaItems)
{
if(find(firstCriteriaItems->begin(),firstCriteriaItems->end(),person)==firstCriteriaItems->end())
{
firstCriteriaItems->push_back(person);
}
}
return firstCriteriaItems;
}
private:
shared_ptr<Criteria> _criteria;
shared_ptr<Criteria> _othercriteria;
};
void printPersons(shared_ptr<list<Person>> persons)
{
for(auto& person:*persons)
{
cout<<"Person:[Name:"<<person.getName();
cout<<",Gender:"<<person.getGender();
cout<<",Marital Status:"<<person.getMaritalStstus()<<"]"<<endl;
}
}
int main()
{
shared_ptr<list<Person>> persons = make_shared<list<Person>>();
persons->emplace_back("Robert","male","single");
persons->emplace_back("John","male","married");
persons->emplace_back("Laura","female","married");
persons->emplace_back("Diana","female","single");
persons->emplace_back("Mike","male","single");
persons->emplace_back("Bobby","male","single");
shared_ptr<Criteria> male = make_shared<CriteriaMale>();
shared_ptr<Criteria> female = make_shared<CriteriaFemale>();
shared_ptr<Criteria> single = make_shared<CriteriaSingle>();
shared_ptr<Criteria> singleMale = make_shared<AndCriteria>(single,male);
shared_ptr<Criteria> singleOrFemale = make_shared<OrCriteria>(single,female);
cout<<"Male:"<<endl;
printPersons(male->meetCriteria(persons));
cout<<"\nFemale:"<<endl;
printPersons(female->meetCriteria(persons));
cout<<"\nSingle Male:"<<endl;
printPersons(singleMale->meetCriteria(persons));
cout<<"\nSingle Or Female:"<<endl;
printPersons(singleOrFemale->meetCriteria(persons));
}
二、运行结果: