什么过滤器模式
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
应用场景
数据过滤、筛选、验证等
PHP 代码实现
<?php
/**
* 对象类
* Class Person
*/
class Person
{
private $name;
private $gender;
private $maritalStatus;
public function __construct($name, $gender, $maritalStatus)
{
$this->name = $name;
$this->gender = $gender;
$this->maritalStatus = $maritalStatus;
}
public function __get($attributes)
{
return $this->$attributes;
}
}
/**
* 抽象接口,规范实现类
* Interface Criteria
*/
abstract class Criteria
{
abstract public function meetCriteria($persons);
}
/**
* 男性类筛选
* Class CriteriaMale
*/
class CriteriaMale extends Criteria
{
public function meetCriteria($persons)
{
$malePerson = [];
foreach ($persons as $person) {
if (strtoupper($person->gender) == 'MALE') {
$malePerson[] = $person;
}
}
return $malePerson;
}
}
/**
* 女性类筛选
* Class CriteriaFemale
*/
class CriteriaFemale extends Criteria
{
public function meetCriteria($persons)
{
$femalePerson = [];
foreach ($persons as $person) {
if (strtoupper($person->gender) == 'FEMALE') {
$femalePerson[] = $person;
}
}
return $femalePerson;
}
}
/**
* 单身类筛选
* Class CriteriaSingle
*/
class CriteriaSingle extends Criteria
{
public function meetCriteria($persons)
{
$singlePerson = [];
foreach ($persons as $person) {
if (strtoupper($person->maritalStatus) == 'SINGLE') {
$singlePerson[] = $person;
}
}
return $singlePerson;
}
}
/**
* 或条件筛选
* Class OrCriteria
*/
class OrCriteria extends Criteria
{
private $criteria;
private $otherCriteria;
public function __construct(Criteria $criteria, Criteria $otherCriteria)
{
$this->criteria = $criteria;
$this->otherCriteria = $otherCriteria;
}
public function meetCriteria($persons)
{
$firstCriteriaItems = $this->criteria->meetCriteria($persons);
$otherCriteriaItems = $this->otherCriteria->meetCriteria($persons);
foreach ($otherCriteriaItems as $person) {
if (!in_array($person, $firstCriteriaItems)) {
$firstCriteriaItems[] = $person;
}
}
return $firstCriteriaItems;
}
}
/**
* 并条件筛选
* Class AndCriteria
*/
class AndCriteria extends Criteria
{
private $criteria;
private $otherCriteria;
public function __construct(Criteria $criteria,Criteria $otherCriteria)
{
$this->criteria = $criteria;
$this->otherCriteria = $otherCriteria;
}
public function meetCriteria($persons)
{
$firstCriteriaPerson = $this->criteria->meetCriteria($persons);
return $this->otherCriteria->meetCriteria($firstCriteriaPerson);
}
}
//=======================过滤器模式测试===============================
//初始化
$persons = [];
$persons[] = (new Person("Robert","Male", "Single"));
$persons[] = (new Person("John","Male", "Married"));
$persons[] = (new Person("Laura","Female", "Married"));
$persons[] = (new Person("Diana","Female", "Single"));
$persons[] = (new Person("Mike","Male", "Single"));
$persons[] = (new Person("Bobby","Male", "Single"));
$male = new CriteriaMale();//男性类筛选
$female = new CriteriaFemale();//女性类筛选
$single = new CriteriaSingle();//单身类筛选
$singleMale = new AndCriteria($single, $male);//并条件筛选
$singleOrFemale = new OrCriteria($single, $female);//或条件筛选
//Males:
//Robert John Mike Bobby
echo "男性:";
$maleList = $male->meetCriteria($persons);
foreach ($maleList as $male){
echo $male->name . '、';
}
echo '<hr>';//横线
//Females:
//Laura Diana
echo "女性:";
$maleList = $female->meetCriteria($persons);
foreach ($maleList as $male){
echo $male->name . '、';
}
echo '<hr>';//横线
//Single Males:
//Robert Mike Bobby
echo "单身男性:";
$singleMaleList = $singleMale->meetCriteria($persons);
foreach ($singleMaleList as $male){
echo $male->name . '、';
}
echo '<hr>';//横线
//Single Or Females:
//Robert Diana Mike Bobby Laura
echo "单身或女性:";
$singleOrFemaleList = $singleOrFemale->meetCriteria($persons);
foreach ($singleOrFemaleList as $person){
echo $person->name . '、';
}
//结果
//男性:Robert、John、Mike、Bobby、
//女性:Laura、Diana、
//单身男性:Robert、Mike、Bobby、
//单身或女性:Robert、Diana、Mike、Bobby、Laura、
参考资料:
https://www.cnblogs.com/zhouqi666/p/9136688.html