设计模式-过滤器模式 C#版本

本文介绍了C#版本的过滤器模式,这是一种结构型设计模式,用于根据多种标准过滤对象列表。文章详细展示了如何创建Person对象、Criteria接口以及实现了该接口的实体类,如CriteriaMale、CriteriaFemale、CriteriaSingle等,还演示了如何通过AndCriteria和OrCriteria组合标准进行过滤。通过示例代码,展示了如何使用这些标准过滤Person对象并输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式-过滤器模式 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.执行程序,输出结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值