设计模式--过滤器模式

过滤器模式:又叫标准模式属于结构型模式
基本原理:创建过滤器,过滤出符合标准的对象。
主要流程:
            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;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值