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

过滤器模式

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

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

参考资料:

原文地址:https://www.cnblogs.com/Andres/p/8999791.html

时间: 2024-10-12 07:46:27

设计模式学习系列——过滤器模式的相关文章

设计模式学习之-状态模式

一.状态模式状态模式,当一个对象的内在状态发生改变时允许改变其行为行为,这个对象像是改变了其子类.状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同的状态的一系列类当中,可以把复杂的判断逻辑简化.当然,如果这个状态判断比较简单,那就没有必要用“状态模式”了.这段话有点难以理解,简而言之就是,在一类中根据当前状态去实例化下一状态子类.下面是状态模式结构图. State类,是一个抽象状态类,定义一个接口以封装与Context的特定状态相关的行为.

设计模式学习02—工厂模式

1.动机与定义 我们在程序中使用一个对象时,需要new一下,如果需要设置其他值就再初始化一下.比如我要使用一个按钮,手动new一个矩形按钮,然后初始化一些值,如显示文字,背景色等. // 矩形按钮 IButton btn = new RecButton(); // 初始化其他值 btn.setText("提交"); btn.setBackgroundColor("#00aaff"); // 其他初始化省略 // 圆形按钮 IButton btn2 = new Rou

设计模式学习之外观模式(Facade,结构型模式)(8)

1.什么是外观模式为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 2.为什么要使用外观模式在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,从而导致客户程序随着子系统的变化而变化,那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦? 现在来考虑这样一个抵押系统,当有一个客户来时,有如下几件事情需要确认:到银行子系统查询他是否有足够多的存款,到信用子系统查询他是否有良好的信

设计模式学习05—原型模式

一.动机与定义 之前学习原型模式一直以为原型模式目的是为了方便的创建相同或相似对象,用复制对象的方式替换new的方式,还研究了深克隆和浅克隆.最近仔细看了GOF的设计模式,发现原型模式的本意并不仅仅是复制对象这么简单. 复制对象确实是一方面,当我们需要大量相似,甚至相同对象的时候,除了一个个的new之外,还可以根据一个原型,直接复制出更多的对象.但是如果把原型模式认为只是复制对象这么简单就错了. 创建型模式主要讲如何创建对象,通常包含何时创建,谁来创建,怎么创建等.GOF书里面写的意图是,用原型

设计模式学习之代理模式(Proxy)

一.代理模式的初衷 不想让客户端直接访问具体实现接口,客户端不应该直接访问具体实现,一般会涉及到以下四个对象 业务接口:定义客户端访问的接口,是实现类和代理类都需要实现的 实现类:实现了业务接口,真正的实现是在这里 代理类:同样实现了业务接口,一般都会关联一个实现类的实例,由它来调用实现类 客户端:顾名思义,使用者,与代理类打交道,甚至都不知道具体实现类的存在. 二.代理模式设计图 三.代理模式的简单实现代码 BizInterface.java package com.lipan.designp

设计模式学习--------12.代理模式学习

场景: 福尔摩斯一直想送礼物给花生,但是羞于直接赠送,于是想到让房东太太去帮忙送礼物.编程如何实现呢? 定义: 为其他对象提供一种代理以控制对这个对象的访问. 角色: Proxy:代理对象.有下列功能: 实现与具体的目标对象一样的接口,这样就可以使用代理来代替具体的目标对象. 持有一个具体目标对象的引用,可以在需要时调用具体的目标对象. 可以控制对目标对象的访问,并可以负责创建和删除它. package com.kris.study; public class Proxy implements

设计模式学习之模板方法模式(TemplateMethod,行为型模式)(9)

一.什么是模板方法模式 Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. 二.模板方法模式的应用场景 Template Method模式一般应用在具有以下条件的应用中: - 具有统一的操作步骤或操作过程 - 具有不同的操作细节 - 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同 private static void Main(string[] arg

设计模式学习04—建造者模式

一.动机与定义 创建对象时,我们知道可以使用工厂方式来创建,使调用者和具体实现解耦,但是有一种情况,当要创建的多个对象之间重复性较大,只有创建步骤.组装顺序或者内部构件不同时,工厂模式就需要进一步的演化了,如我们去KFC,有很多种套餐,比如套餐1(薯条+可乐+汉堡),套餐2(鸡肉卷+薯条+可乐),这个套餐就是我们要获取的复杂对象,那么程序如何创建出这种对象呢. 我们看到套餐的内容很多是一样的,那么我们是不是可以考虑将创建单个食品(如鸡肉卷.可乐等)方法提取出来,使用单独一个类协调这些食品的组合比

设计模式学习之代理模式学习(一)

关于设计模式想必学习过Java语言的人都知道吧,当时对其进行深入学习的的人应该不是很多.在我看来设计方面的知识相比于框架应用配置等知识要有意思的多,并且设计模式的对一个程序员的编程思想提升有着很大的帮助.但是设计模式有二十三种,想要全部掌握还是要花点时间的,但如果是只学习常用的几种设计模式还是相对容易的.下面是我学习代理模式的一些心得. 问题引出      什么是代理模式,为什么要用代理模式. 现在有一个场景模拟:有一个tank类,他实现了Moveable接口,Moveable接口中有一个mov