设计模式学习系列——过滤器模式

Posted Andrés

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式学习系列——过滤器模式相关的知识,希望对你有一定的参考价值。

过滤器模式

  过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

  故名思意,就是将原始数据经过不同规则的筛选得到想要的数据。

  角色:1)待过滤数据类;2)过滤器;3)逻辑过滤器;4)使用者

  最近在找工作,这真是一个活生生被过滤的例子啊。于是以找工作,和公司各种过滤条件为例,详见代码(php版本):

技术分享图片
  1 <?php
  2 /*
  3  * 过滤器方法模式示例
  4  */
  5 
  6 preg_match("/cli/i", php_sapi_name()) ? define(‘LINE_BREAK‘, PHP_EOL) : define(‘LINE_BREAK‘, "<br/>");
  7 
  8 /*
  9  * 角色:待过滤数据类
 10  * 找工作者
 11  */
 12 class JobSeeker
 13 {
 14     private $_name;
 15     private $_age;
 16     private $_sex;
 17     private $_working_years;
 18     private $_skills;
 19     
 20     public function __construct($name,$age,$sex,$working_years,$skills) {
 21         $this->_name = $name;
 22         $this->_age = $age;
 23         $this->_sex = $sex;
 24         $this->_working_years = $working_years;
 25         $this->_skills = $skills;
 26     }
 27 
 28     public function getName(){
 29         return $this->_name;
 30     }    
 31     public function getAge(){
 32         return $this->_age;
 33     }
 34     public function getSex(){
 35         return $this->_sex;
 36     }
 37     public function getWorkingYears(){
 38         return $this->_working_years;
 39     }
 40     public function getSkills(){
 41         return $this->_skills;
 42     }    
 43 }
 44 
 45 
 46 /*
 47  *用来过滤的接口类 
 48  */
 49 interface Criteria{
 50     public function meetCriteria( $job_seekers);
 51 } 
 52 
 53 /*
 54  * 角色:过滤器
 55  * 只需要男性的过滤类
 56  */
 57 
 58 class CriteriaMale implements Criteria{
 59     public function meetCriteria( $job_seekers) {
 60         if(empty($job_seekers))
 61             return null;
 62         $job_seekers_criteria_male = array();
 63         foreach($job_seekers as $job_seeker){
 64             if($job_seeker->getSex() == "male")
 65                 $job_seekers_criteria_male[] = $job_seeker;
 66         }
 67         return $job_seekers_criteria_male;
 68     }
 69 }
 70 
 71 /*
 72  * 角色:过滤器
 73  * 年龄区间的过滤器
 74  */
 75 class CriteriaAge implements Criteria{
 76     private $_min = 18;
 77     private $_max;
 78     public function __construct($min,$max) {
 79         $this->_min = $min;
 80         $this->_max = $max;
 81     }
 82     public function meetCriteria( $job_seekers){
 83         $job_seekers_criteria_age = array();
 84         foreach($job_seekers as $job_seek){
 85             $age = $job_seek->getAge();
 86             if(is_int($age) && $age >= $this->_min && $age <= $this->_max){
 87                 $job_seekers_criteria_age[] = $job_seek;
 88             }
 89         }
 90         return $job_seekers_criteria_age;
 91     }
 92 }
 93 
 94 /*
 95  * 角色:逻辑过滤器
 96  * AND过滤器
 97  */
 98 class CriteriaAnd implements Criteria{
 99     private $_criteria;
100     private $_another_criteria;
101     
102     public function __construct($criteria,$another_criteria) {
103         $this->_criteria = $criteria;
104         $this->_another_criteria = $another_criteria;
105     }
106     public function meetCriteria( $job_seekers) {
107         $firstCriteriaPersons = $this->_criteria->meetCriteria($job_seekers);
108         return $this->_another_criteria->meetCriteria($firstCriteriaPersons);
109     }
110 }
111 
112 /*
113  * 打印筛选后人资料,与设计模式无关
114  */
115 function printPerson($job_seekers){
116     if(empty($job_seekers)){
117         echo "".LINE_BREAK;return;
118     }
119     foreach($job_seekers as $job_seeker){
120         printf("Person : [ Name : %s , Age : %s , Sex : %s , Working Years : %s , Skills : %s ]".LINE_BREAK,$job_seeker->getName(),$job_seeker->getAge(),$job_seeker->getSex(),$job_seeker->getWorkingYears(),$job_seeker->getSkills());
121     }
122     
123 }
124 /*
125  * 角色:使用者
126  * 实际中就是HR。。。
127  */
128 $job_seekers = array();
129 $job_seekers[] = new JobSeeker("xiao wang", 31, "male", 8, "php");
130 $job_seekers[] = new JobSeeker("xiao li", 25, "male", 2, "java");
131 $job_seekers[] = new JobSeeker("xiao zhan", 26, "female", 3, "test");
132 $job_seekers[] = new JobSeeker("xiao huang", 28, "male", 4, "python");
133 $job_seekers[] = new JobSeeker("xiao huang", 22, "male", 0, "c");
134 
135 $male = new CriteriaMale();
136 $age_under_30 = new CriteriaAge(18,30);
137 $male_and_age_under_30 = new CriteriaAnd($male,$age_under_30);
138 
139 echo "Males:".LINE_BREAK;
140 printPerson($male->meetCriteria($job_seekers));
141 echo "Age Under 30:".LINE_BREAK;
142 printPerson($age_under_30->meetCriteria($job_seekers));
143 echo "Males And Age Under 30:".LINE_BREAK;
144 printPerson($male_and_age_under_30->meetCriteria($job_seekers));
145 /*
146  Males:
147 Person : [ Name : xiao wang , Age : 31 , Sex : male , Working Years : 8 , Skills : php ]
148 Person : [ Name : xiao li , Age : 25 , Sex : male , Working Years : 2 , Skills : java ]
149 Person : [ Name : xiao huang , Age : 28 , Sex : male , Working Years : 4 , Skills : python ]
150 Person : [ Name : xiao huang , Age : 22 , Sex : male , Working Years : 0 , Skills : c ]
151 Age Under 30:
152 Person : [ Name : xiao li , Age : 25 , Sex : male , Working Years : 2 , Skills : java ]
153 Person : [ Name : xiao zhan , Age : 26 , Sex : female , Working Years : 3 , Skills : test ]
154 Person : [ Name : xiao huang , Age : 28 , Sex : male , Working Years : 4 , Skills : python ]
155 Person : [ Name : xiao huang , Age : 22 , Sex : male , Working Years : 0 , Skills : c ]
156 Males And Age Under 30:
157 Person : [ Name : xiao li , Age : 25 , Sex : male , Working Years : 2 , Skills : java ]
158 Person : [ Name : xiao huang , Age : 28 , Sex : male , Working Years : 4 , Skills : python ]
159 Person : [ Name : xiao huang , Age : 22 , Sex : male , Working Years : 0 , Skills : c ]
160  */
View Code

  第一个是过滤只要男性,第二个是过滤只要30岁以下的,第三个过滤是只要男性和30岁以下的。

 

 

参考资料:

 

以上是关于设计模式学习系列——过滤器模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式

编程拾遗系列设计模式-创建型模式

单例设计模式详解+源代码+JDK源码应用——Java设计模式系列学习笔记

快速入门系列--MVC--01概述

用于从 cloudkit 检索单列的代码模式/片段

设计模式系列,六大设计原则