一天一个设计模式(8)——过滤器模式

过滤器模式

  过滤器模式非常容易理解,简单来说就是设计一组类来过滤对象。

实例

  需要过滤的类:

复制代码
class Person
{
    public $name;
    public $gender;
    public $maritalStatus;

    function __construct($name, $gender, $maritalStatus)
    {
        $this->name = $name;
        $this->gender = $gender;
        $this->maritalStatus = $maritalStatus;
    }
}
Bin_x
复制代码

  过滤器接口:

复制代码
interface Criteria
{
    /**
     * @param $persons Person[]
     * @return Person[]
     */
    public function filter($persons);
}
Bin_x
复制代码

  实现接口的类:

复制代码
class MaleCriteria implements Criteria
{

    /**
     * @param $persons
     * @return Person[]
     */
    public function filter($persons)
    {
        $result = [];
        foreach ($persons as $person) {
            if (strtolower($person->gender) === 'male') {
                $result[] = $person;
            }
        }
        return $result;
    }
}

class FemaleCriteria implements Criteria
{

    /**
     * @param $persons
     * @return Person[]
     */
    public function filter($persons)
    {
        $result = [];
        foreach ($persons as $person) {
            if (strtolower($person->gender) === 'female') {
                $result[] = $person;
            }
        }
        return $result;
    }
}

class SingleCriteria implements Criteria
{

    /**
     * @param $persons
     * @return Person[]
     */
    public function filter($persons)
    {
        $result = [];
        foreach ($persons as $person) {
            if (strtolower($person->maritalStatus) === 'single') {
                $result[] = $person;
            }
        }
        return $result;
    }
}
Bin_x
复制代码

  连接多个过滤器的类:

复制代码
class AndCriteria implements Criteria
{

    /**
     * @var Criteria
     */
    private $_criteria1;
    /**
     * @var Criteria
     */
    private $_criteria2;

    function __construct($criteria1, $criteria2)
    {
        $this->_criteria1 = $criteria1;
        $this->_criteria2 = $criteria2;
    }

    /**
     * @param $persons Person[]
     * @return Person[]
     */
    public function filter($persons)
    {
        return $this->_criteria2->filter($this->_criteria1->filter($persons));
    }
}

class OrCriteria implements Criteria
{

    /**
     * @var Criteria
     */
    private $_criteria1;
    /**
     * @var Criteria
     */
    private $_criteria2;

    function __construct($criteria1, $criteria2)
    {
        $this->_criteria1 = $criteria1;
        $this->_criteria2 = $criteria2;
    }

    /**
     * @param $persons Person[]
     * @return Person[]
     */
    public function filter($persons)
    {
        $result1 = $this->_criteria1->filter($persons);
        $result2 = $this->_criteria2->filter($persons);
        foreach ($result2 as $person) {
            if (!in_array($person, $result1)) {
                $result1[] = $person;
            }
        }
        return $result1;
    }
}
Bin_x
复制代码

  应用:

复制代码
$data=[
    new Person("Robert", "Male", "Single"),
    new Person("John", "Male", "Married"),
    new Person("Laura", "Female", "Married"),
    new Person("Diana", "Female", "Single"),
    new Person("Mike", "Male", "Single"),
    new Person("Bobby", "Male", "Single")
];

$maleCriteria=new MaleCriteria();
$femaleCriteria=new FemaleCriteria();
$singleCriteria=new SingleCriteria();
$singleMaleCriteria=new AndCriteria($singleCriteria,$maleCriteria);
$singleMaleCriteriaOrFemaleCriteria=new OrCriteria($femaleCriteria,$singleMaleCriteria);

print_r($singleMaleCriteriaOrFemaleCriteria->filter($data));
Bin_x
复制代码

 

posted @   Bin_x  阅读(210)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示