過濾器模式 過濾器模式(Filter Pattern)或標准模式(Criteria Pattern)是一種設計模式,這種模式允許開發人員使用不同的標准來過濾一組對象,通過邏輯運算以解耦的方式把它們連接起來。這種類型的設計模式屬於結構型模式,它結合多個標准來獲得單一標准。 實現 我們將創建一個 Person 對象、Criteria 接口和實現了該接口的實體類,來過濾 Person 對象的列表。CriteriaPatternDemo,我..
過濾器模式(Filter Pattern)或標准模式(Criteria Pattern)是一種設計模式,這種模式允許開發人員使用不同的標准來過濾一組對象,通過邏輯運算以解耦的方式把它們連接起來。這種類型的設計模式屬於結構型模式,它結合多個標准來獲得單一標准。
/**
* 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.' ';
}

