PHP 设计模式(九):过滤器模式

什么过滤器模式

过滤器模式(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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值