设计模式-过滤器模式 C#版本
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
实现
我们将创建一个 Person 对象、Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表。CriteriaPatternDemo 类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Person 对象的列表。
1.创建一个类,在该类上应用标准。
public class Person
{
private String name;
private String gender;
private 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)创建一个接口。
public interface Criteria
{
public List<Person> meetCriteria(List<Person> persons);
}
3.创建实现了 Criteria 接口的实体类。
public class CriteriaMale : Criteria
{
public List<Person> meetCriteria(List<Person> persons)
{
List<Person> malePersons = new List<Person>();
foreach (Person person in persons)
{
if (person.getGender().ToUpper() == ("MALE").ToUpper())
{
malePersons.Add(person);
}
}
return malePersons;
}
}
public class CriteriaFemale : Criteria
{
public List<Person> meetCriteria(List<Person> persons)
{
List<Person> malePersons = new List<Person>();
foreach (Person person in persons)
{
if (person.getGender().ToUpper() == ("FEMALE").ToUpper())
{
malePersons.Add(person);
}
}
return malePersons;
}
}
public class CriteriaSingle : Criteria
{
public List<Person> meetCriteria(List<Person> persons)
{
List<Person> malePersons = new List<Person>();
foreach (Person person in persons)
{
if (person.getMaritalStatus().ToUpper() == ("SINGLE").ToUpper())
{
malePersons.Add(person);
}
}
return malePersons;
}
}
public class AndCriteria : Criteria
{
private Criteria criteria;
private Criteria otherCriteria;
public AndCriteria(Criteria criteria, Criteria otherCriteria)
{
this.criteria = criteria;
this.otherCriteria = otherCriteria;
}
public List<Person> meetCriteria(List<Person> persons)
{
List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);
return otherCriteria.meetCriteria(firstCriteriaPersons);
}
}
public class OrCriteria : Criteria
{
private Criteria criteria;
private Criteria otherCriteria;
public OrCriteria(Criteria criteria, Criteria otherCriteria)
{
this.criteria = criteria;
this.otherCriteria = otherCriteria;
}
public List<Person> meetCriteria(List<Person> persons)
{
List<Person> firstCriteriaItems = criteria.meetCriteria(persons);
List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);
foreach (Person person in otherCriteriaItems)
{
if (!firstCriteriaItems.Contains(person))
{
firstCriteriaItems.Add(person);
}
}
return firstCriteriaItems;
}
}
4.使用不同的标准(Criteria)和它们的结合来过滤 Person 对象的列表。
// See https://aka.ms/new-console-template for more information
using FilterPattern;
Console.WriteLine("Hello, World!");
static void printPersons(List<Person> persons)
{
foreach (Person person in persons)
{
Console.WriteLine("Person : [ Name : " + person.getName()
+ ", Gender : " + person.getGender()
+ ", Marital Status : " + person.getMaritalStatus()
+ " ]");
}
}
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.ReadLine();
5.执行程序,输出结果: