过滤器模式(Filter Pattern)
基本概念:
过滤器模式用于在一个列表(或其他容器)中,有条件的过滤一组对象。在容器中存放一组对象,按照事先约定好的规则,从这一组对象中返回一个个体或满足相应规则的子集合。
具体应用举例:
例如车库里停放着一定数量的汽车,有BENZ,BMW,AUDI,LEXUS等,车型有SUV,MPV, JEEP, VAN等,司机性别有男,有女。这个时候,我们想列出一个表格,表格里免得车牌全部都是BENZ。这个时候就可以使用过滤器模式进行BENZ品牌汽车的过滤。
上代码:
//待分类对象
//H
#pragma once
#include <iostream>
#include <string>
#include <assert.h>
using namespace std;
class Car
{
public:
Car(string brand, string model,string gender);
~Car(void);
public:
string getBrand();
string getModel();
string getGender();
private:
string _brand;//car brand,BENZ, BMW, AUDI, LUXES
string _model;//car model,SUV, MPV, JEEP, VAN
string _gender;//drivergender, male, female
};
//CPP
#include "Car.h"
//CONSTRUCTOR
Car::Car(string brand,string model, string gender)
{
assert(!brand.empty() && !model.empty()&& !gender.empty());
_brand = brand;
_gender = gender;
_model = model;
}
//DESTRUCTOR
Car::~Car(void)
{
}
string Car::getBrand()
{
return _brand;
}
string Car::getGender()
{
return _gender;
}
string Car::getModel()
{
return _model;
}
//过滤器
//H
#pragma once
#include "Filter.h"
class BENZFilter: publicFilter
{
public:
BENZFilter(void);
~BENZFilter(void);
vector<Car> filter(vector<Car> s);
};
//CPP
#include "BENZFilter.h"
BENZFilter::BENZFilter(void)
{
}
BENZFilter::~BENZFilter(void)
{
}
vector<Car> BENZFilter::filter(vector<Car>s)
{
vector<Car> temp;
for(vector<Car>::iterator car=s.begin();car!=s.end(); car++)
{
if((*car).getBrand() == "BENZ")
temp.push_back(*car);
}
return temp;
}
//验证
#include <iostream>
#include "Car.h"
#include "BENZFilter.h"
#include "Filter.h"
int main()
{
cout<<"Filter Pattern"<<endl;
vector<Car> carlist;
vector<Car> benzlist;
Car* car1 = new Car("BENZ", "SUV","Male");
Car* car2 = new Car("AUDI", "VAN","Female");
Car* car3 = new Car("BENZ", "SUV","Female");
Car* car4 = new Car("BMW", "SUV","Male");
carlist.push_back(*car1);
carlist.push_back(*car2);
carlist.push_back(*car3);
carlist.push_back(*car4);
for(vector<Car>::iterator s=carlist.begin();s!=carlist.end(); s++)
{
cout<<"car: "<<(*s).getBrand()<<""<<(*s).getGender()<<" "<<(*s).getModel()<<""<<endl;
}
BENZFilter* filter = new BENZFilter();
benzlist = filter->filter(carlist);
cout<<"BENZ LIST:"<<endl;
for(vector<Car>::iterator benz=benzlist.begin();benz!=benzlist.end(); benz++)
{
cout<<"car: "<<(*benz).getBrand()<<""<<(*benz).getGender()<<" "<<(*benz).getModel()<<""<<endl;
}
}