/**
* github地址:https://github.com/ZQCard/design_pattern
* 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式, * 这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。
* 这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。* 例子:筛选男人、女人、单身男人、单身女人
*
*/

(1)Person.class.php(对象类)

<?php

namespace Filter;

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;
}
}

(2)Criteria.class.php(抽象接口,规范实现类)

<?php

namespace Filter;

interface Criteria
{
public function meetCriteria($persons);
}

(3)Male.class.php(男性类筛选)

<?php

namespace Filter;

class CriteriaMale implements Criteria
{
public function meetCriteria($persons)
{
$malePerson = [];
foreach ($persons as $person) {
if (strtoupper($person->gender) == 'MALE') {
$malePerson[] = $person;
}
}
return $malePerson;
}
}

(4)Female.class.php(女性类筛选)

<?php

namespace Filter;

class CriteriaFemale implements Criteria
{
public function meetCriteria($persons)
{
$femalePerson = [];
foreach ($persons as $person) {
if (strtoupper($person->gender) == 'FEMALE') {
$femalePerson[] = $person;
}
}
return $femalePerson;
}
}

(5)Single.class.php(单身类筛选)

<?php

namespace Filter;

class CriteriaSingle implements Criteria
{
public function meetCriteria($persons)
{
$singlePerson = [];
foreach ($persons as $person) {
if (strtoupper($person->maritalStatus) == 'SINGLE') {
$singlePerson[] = $person;
}
}
return $singlePerson;
}
}

(6)OrCriteria.class.php(或者条件筛选)

<?php

namespace Filter;

class OrCriteria implements 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;
}
}

(6)AndCriteria.class.php(并且条件筛选)

<?php

namespace Filter;

class AndCriteria implements 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);
}
}

(7)filter.php(客户端)

<?php
spl_autoload_register(function ($className){
$className = str_replace('\\','/',$className);
include $className.".class.php";
}); use Filter\Person;
use Filter\CriteriaMale;
use Filter\CriteriaFemale;
use Filter\CriteriaSingle;
use Filter\AndCriteria;
use Filter\OrCriteria; $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 "Males:";
$maleList = $male->meetCriteria($persons);
foreach ($maleList as $male){
echo $male->name.' ';
}
echo '<br/>'; //Females:
//Laura Diana
echo "Females:";
$maleList = $female->meetCriteria($persons);
foreach ($maleList as $male){
echo $male->name.' ';
}
echo '<br/>'; //Single Males:
//Robert Mike Bobby
echo "Single Males:";
$singleMaleList = $singleMale->meetCriteria($persons);
foreach ($singleMaleList as $male){
echo $male->name.' ';
}
echo '<br/>'; //Single Or Females:
//Robert Diana Mike Bobby Laura
echo "Single Or Females:";
$singleOrFemaleList = $singleOrFemale->meetCriteria($persons);
foreach ($singleOrFemaleList as $person){
echo $person->name.' ';
}

设计模式之过滤器模式(php实现)的更多相关文章

  1. 设计模式之过滤器模式——Java语言描述

    过滤器模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来 实现 创建一个Person对象.Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列 ...

  2. Java设计模式应用——过滤器模式

    storm引擎计算出一批中间告警结果,会发送一条kafka消息给告警入库服务,告警入库服务接收到kafka消息后读取中间告警文件,经过一系列处理后把最终告警存入mysql中. 实际上,中间告警结果可能 ...

  3. 设计模式系列之过滤器模式(Chriteria Pattern)

    过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这种类 ...

  4. [07]Go设计模式:过滤器模式(FilterPattern)

    目录 过滤器模式 一.简介 二.代码 三.参考链接 过滤器模式 一.简介 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使 ...

  5. 【设计模式 - 7】之过滤器模式(Filter)

    1      模式简介 过滤器模式(Filter)也叫标准模式(Criteria),这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来. 2      实例 需求 ...

  6. 设计模式のFilterPattern(过滤器模式)----结构模式

    一.产生背景 我们有一堆“人”的对象,我们应该怎么选择出其中的男性.女性或者其他类型的呢?这时候我们可以用过滤器模式 二.通常做法 我们将创建一个 Person 对象.Criteria 接口和实现了该 ...

  7. Python进阶:设计模式之迭代器模式

    在软件开发领域中,人们经常会用到这一个概念——“设计模式”(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础 ...

  8. Java进阶篇设计模式之六 ----- 组合模式和过滤器模式

    前言 在上一篇中我们学习了结构型模式的外观模式和装饰器模式.本篇则来学习下组合模式和过滤器模式. 组合模式 简介 组合模式是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来 ...

  9. 过滤器模式(Filter Pattern)

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

随机推荐

  1. rxjs的世界

    rxjs学习了几个月了,看了大量的东西,在理解Observable的本文借鉴的是渔夫的故事,原文,知识的主线以<深入浅出rxjs>为主,动图借鉴了rxjs中文社区翻译的文章和国外的一个动图 ...

  2. ccpc 网络赛 hdu 6155

    # ccpc 网络赛 hdu 6155(矩阵乘法 + 线段树) 题意: 给出 01 串,要么询问某个区间内不同的 01 子序列数量,要么把区间翻转. 叉姐的题解: 先考虑怎么算 \(s_1, s_2, ...

  3. Batting Practice LightOJ - 1408

    Batting Practice LightOJ - 1408(概率dp) 题意:有无限个球,进球的概率为p,问你连续不进k1个球或者连续进k2个球需要使用的球的个数的期望 思路: \(定义f[i]表 ...

  4. BZOJ2879 [Noi2012]美食节 【费用流】

    题目 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都很可 ...

  5. 洛谷 P4514 上帝造题的七分钟 解题报告

    P4514 上帝造题的七分钟 题目背景 裸体(裸题)就意味着身体(神题). 题目描述 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了\(0\)的\(n \times m\)矩阵. 第二 ...

  6. saltstack 实现系统初始化

    1.整体结构如下 [root@zabbix init]# pwd /srv/salt/base/init [root@zabbix init]# ll total -rw-r--r-- root ro ...

  7. Linux命令之Nano基础指南

    Nano基础指南 1.  Nano基础 目的 这是篇nano简明使用指南,帮助你快速了解nano的基本用法.如想获取更多的帮助信息,请参阅: http://www.nano-editor.org 打开 ...

  8. css去掉点击连接时所产生的虚线边框技巧兼容符合w3c标准的浏览器

    解决方法: 1.在css中加上outline:none; 代码如下: a.fontnav { text-align:left;color:#555; text-decoration:none; out ...

  9. Pandas之Series

    # Series 数据结构 # Series 是带有标签的一维数组,可以保存任何数据类型(整数,字符串,浮点数,Python对象等),轴标签统称为索引 import numpy as np impor ...

  10. 云服务器基本环境配置(php5.6+mysql+nginx)

    1.安装nginx sudo apt-get install nginx nginx 基本配置 server{ listen ; server_name www.xxxxxx.cn; root /va ...