设计模式——过滤器模式(C++实现)

过滤器模式

              允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。属于结构型模式,它结合多个标准来获得单一标准。

适用场景

            需要在一个集合中按照一定的条件和规则筛选出子集合,可以用过滤器模式。

采用菜鸟教程的例子,这里用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上运行结果:

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值