過濾器模式
過濾器模式(Filter Pattern)或標準模式(Criteria Pattern)是一種設計模式,這種模式允許開發人員使用不同的標準來過濾一組對象,通過邏輯運算以解耦的方式把它們連接起來。這種類型的設計模式屬於結構型模式,它結合多個標準來獲得單一標準。
實現
我們將創建一個 Person 對象、Criteria 接口和實現了該接口的實體類,來過濾 Person 對象的列表。CriteriaPatternDemo,我們的演示類使用 Criteria 對象,基於各種標準和它們的結合來過濾 Person 對象的列表。
步驟 1
創建一個類,在該類上應用標準。
Person.cs
namespace Filter_Pattern
{
class Person
{
string name; //名字
string gender; //性別
string maritalStatus; //婚姻狀況
public Person(string name, string gender, string maritalStatus)
{
this.name = name;
this.gender = gender;
this.maritalStatus = maritalStatus;
}
public string getName()
{
return name;
}
public string getGender()
{
return gender;
}
public string getMaritalStatus()
{
return maritalStatus;
}
}
}
步驟 2
爲標準(Criteria)創建一個接口。
Criteria.cs
using System.Collections.Generic;
namespace Filter_Pattern
{
interface Criteria
{
//過濾器的規則函數
List<Person> meetCriteria(List<Person> persons);
}
}
步驟 3
創建實現了 Criteria 接口的實體類。
CriteriaMale.cs
using System.Collections.Generic;
namespace Filter_Pattern
{
class CriteriaMale : Criteria
{
public List<Person> meetCriteria(List<Person> persons)
{
//過濾出滿足性別爲‘MALE’的一些人
List<Person> malePersons = new List<Person>();
foreach (var person in persons)
{
if (person.getGender().Equals("Male"))
malePersons.Add(person);
}
return malePersons;
}
}
}
CriteriaFemale.cs
using System.Collections.Generic;
namespace Filter_Pattern
{
class CriteriaFemale : Criteria
{
public List<Person> meetCriteria(List<Person> persons)
{
//過濾出滿足性別爲‘FEMALE’的一些人
List<Person> femalPerson = new List<Person>();
foreach (var person in persons)
{
if (person.getGender().Equals("Female"))
femalPerson.Add(person);
}
return femalPerson;
}
}
}
CriteriaSingle.cs
using System.Collections.Generic;
namespace Filter_Pattern
{
class CriteriaSingle : Criteria
{
public List<Person> meetCriteria(List<Person> persons)
{
//過濾出單身人羣
List<Person> singlePersons = new List<Person>();
foreach (var person in persons)
{
if (person.getMaritalStatus().Equals("Single"))
singlePersons.Add(person);
}
return singlePersons;
}
}
}
AndCriteria.cs
using System.Collections.Generic;
namespace Filter_Pattern
{
class AndCriteria : Criteria
{
Criteria criteria;
Criteria otherCriteria;
public AndCriteria(Criteria criteria, Criteria otherCriteria)
{
this.criteria = criteria;
this.otherCriteria = otherCriteria;
}
//過濾出同時滿足criteria和otherCriteria規則的人
public List<Person> meetCriteria(List<Person> persons)
{
List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);
return otherCriteria.meetCriteria(firstCriteriaPersons);
}
}
}
OrCriteria.cs
using System.Collections.Generic;
namespace Filter_Pattern
{
class OrCriteria : Criteria
{
Criteria criteria;
Criteria otherCriteria;
public OrCriteria(Criteria criteria, Criteria otherCriteria)
{
this.criteria = criteria;
this.otherCriteria = otherCriteria;
}
//過濾出滿足criteria或者otherCriteria過濾規則的人
public List<Person> meetCriteria(List<Person> persons)
{
List<Person> firstCriteriaItems = criteria.meetCriteria(persons);
List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);
foreach (var person in otherCriteriaItems)
{
if (!firstCriteriaItems.Contains(person))
firstCriteriaItems.Add(person);
}
return firstCriteriaItems;
}
}
}
步驟4
使用不同的標準(Criteria)和它們的結合來過濾 Person 對象的列表。
CriteriaPatternDemo.cs
using System;
using System.Collections.Generic;
namespace Filter_Pattern
{
class CriteriaPatternDemo
{
static void Main(string[] args)
{
List<Person> persons = new List<Person>();
persons.Add(new Person("Robert","Male", "Single"));
persons.Add(new Person("John","Male", "Married"));
persons.Add(new Person("Laura","Female", "Married"));
persons.Add(new Person("Diana","Female", "Single"));
persons.Add(new Person("Mike","Male", "Single"));
persons.Add(new Person("Bobby","Male", "Single"));
Criteria male = new CriteriaMale();
Criteria female = new CriteriaFemale();
Criteria single = new CriteriaSingle();
Criteria singleMale = new AndCriteria(single, male);
Criteria singleOrFemale = new OrCriteria(single, female);
Console.WriteLine("Males: ");
printPersons(male.meetCriteria(persons));
Console.WriteLine("\nFemales: ");
printPersons(female.meetCriteria(persons));
Console.WriteLine("\nSingle Males: ");
printPersons(singleMale.meetCriteria(persons));
Console.WriteLine("\nSingle Or Females: ");
printPersons(singleOrFemale.meetCriteria(persons));
Console.Read();
}
public static void printPersons(List<Person> persons)
{
foreach (var person in persons)
{
Console.WriteLine("Person : [ Name : " + person.getName()
+", Gender : " + person.getGender()
+", Marital Status : " + person.getMaritalStatus()
+" ]");
}
}
}
}
步驟 5
驗證輸出。
Males:
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : John, Gender : Male, Marital Status : Married ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
Females:
Person : [ Name : Laura, Gender : Female, Marital Status : Married ]
Person : [ Name : Diana, Gender : Female, Marital Status : Single ]
Single Males:
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
Single Or Females:
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : Diana, Gender : Female, Marital Status : Single ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
Person : [ Name : Laura, Gender : Female, Marital Status : Married ]