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

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

 

管道与过滤器模式是一种常用于处理数据流的设计模式。在这种模式中,数据流经过一系列的过滤器,每个过滤器负责对数据进行一些处理或转换。这种模式可以用于处理各种类型的数据流,例如文本、图像、音频等等。 在 C# 中,可以使用委托和 Lambda 表达式来实现管道与过滤器模式。下面是一个简单的示例: ```csharp // 定义一个委托类型,用于表示过滤器 delegate string Filter(string input); // 定义一个管道类,用于管理过滤器 class Pipeline { List<Filter> filters = new List<Filter>(); // 添加过滤器 public void AddFilter(Filter filter) { filters.Add(filter); } // 执行管道 public string Execute(string input) { foreach (var filter in filters) { input = filter(input); } return input; } } // 使用管道和过滤器 var pipeline = new Pipeline(); pipeline.AddFilter(s => s.ToUpper()); // 将输入字符串转换为大写 pipeline.AddFilter(s => s.Replace("O", "X")); // 将输入字符串中的 "O" 替换为 "X" var result = pipeline.Execute("Hello World"); // 执行管道 Console.WriteLine(result); // 输出 "HELLX WRLD" ``` 在上面的示例中,我们首先定义了一个委托类型 `Filter`,用于表示过滤器。然后定义了一个 `Pipeline` 类,用于管理过滤器。`Pipeline` 类有两个方法:`AddFilter` 用于添加过滤器,`Execute` 用于执行管道。 在使用管道和过滤器时,我们首先创建一个 `Pipeline` 对象,并添加需要使用的过滤器。然后调用 `Execute` 方法,将输入数据传入管道,管道会按照添加的顺序依次执行每个过滤器,最终返回处理后的结果。 以上就是在 C# 中使用管道与过滤器模式的简单示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值