一天一个设计模式(8)——过滤器模式
过滤器模式
过滤器模式非常容易理解,简单来说就是设计一组类来过滤对象。
实例
需要过滤的类:

class Person { public $name; public $gender; public $maritalStatus; function __construct($name, $gender, $maritalStatus) { $this->name = $name; $this->gender = $gender; $this->maritalStatus = $maritalStatus; } }
过滤器接口:

interface Criteria { /** * @param $persons Person[] * @return Person[] */ public function filter($persons); }
实现接口的类:

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; } }
连接多个过滤器的类:

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; } }
应用:

$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,转载请注明原文链接:https://www.cnblogs.com/Bin-x/p/design8.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于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)