一、产生背景

  我们有一堆“人”的对象,我们应该怎么选择出其中的男性、女性或者其他类型的呢?这时候我们可以用过滤器模式

二、通常做法

  我们将创建一个 Person 对象、Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表。CriteriaPattern,我们的演示类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Person 对象的列表。

三、实例

1、创建person类

namespace FilterPattern
{
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、建立筛选标准

namespace FilterPattern
{
public interface ICriteria
{
List<Person> MeetCriteria(List<Person> persons);
}
}
    public class CriteriaMale : ICriteria
{
public List<Person> MeetCriteria(List<Person> persons)
{
List<Person> malePersons = new List<Person>();
foreach (Person p in persons)
{
if (p.GetGender().Equals("Male"))
malePersons.Add(p);
}
return malePersons;
}
} public class CriteriaFeMale : ICriteria
{
public List<Person> MeetCriteria(List<Person> persons)
{
List<Person> femalePersons = new List<Person>();
foreach (Person p in persons)
{
if (p.GetGender().Equals("Female"))
femalePersons.Add(p);
}
return femalePersons;
}
} public class CriteriaSingle : ICriteria
{
public List<Person> MeetCriteria(List<Person> persons)
{
List<Person> singlePersons = new List<Person>();
foreach (Person p in persons)
{
if (p.GetGender().Equals("Single"))
singlePersons.Add(p);
}
return singlePersons;
}
} public class AndCriteria : ICriteria
{
private ICriteria criteria;
private ICriteria otherCriteria;
public AndCriteria(ICriteria criteria, ICriteria 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 : ICriteria
{
private ICriteria criteria;
private ICriteria otherCriteria;
public OrCriteria(ICriteria criteria, ICriteria 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;
}
}

3、客户端调用

    class Program
{
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")); ICriteria male = new CriteriaMale();
ICriteria female = new CriteriaFeMale();
ICriteria single = new CriteriaSingle();
ICriteria singleMale = new AndCriteria(single, male);
ICriteria 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();
} public static void PrintPersons(List<Person> persons)
{
foreach (Person person in persons)
{
Console.WriteLine("Person : [ Name : " + person.GetName()
+ ", Gender : " + person.GetGender()
+ ", Marital Status : " + person.GetMaritalStatus()
+ " ]");
}
}
}

四、设计模式分析

优点:结构清晰,解耦合

缺点:使类型编的复杂

点击下载源码

设计模式のFilterPattern(过滤器模式)----结构模式的更多相关文章

  1. 设计模式のCompositePattern(组合模式)----结构模式

    一.产生背景 又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式,它创建了对象组的树形结构. 这种模 ...

  2. 十二、享元(Flyweight)模式--结构模式(Structural Pattern)

    Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级".这里使用"享元 模式"更能反映模式的用意. 享元模式以共享 ...

  3. 九、 合成(Composite)模式 --结构模式(Structural Pattern)

    合成模式:有时又叫做部分-整体模式(Part-Whole).合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 合成模式分为安全式和透明式 ...

  4. 七、适配器(Adapter)模式--结构模式(Structural Pattern)

    适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作. 类的 Adapter模式的结构: 类适配器类图: 由图中可以看出,Adaptee ...

  5. 十一、外观(Facade)模式--结构模式(Structural Pattern)

    外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式.门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行. 门面模式提供一个高层次 ...

  6. 十、装饰(Decorator)模式 --结构模式(Structural Pattern)

    装饰(Decorator)模式又名包装(Wrapper)模式[GOF95].装饰模式以对客户端透明的方 式扩展对象的功能,是继承关系的一个替代方案. 装饰模式类图: 类图说明: 抽象构件(Compon ...

  7. 八、桥接模式--结构模式(Structural Pattern)

    桥梁模式:将抽象化(Abstraction)与实现化 (Implementation)脱耦,使得二者可以独立地变化. 桥梁模式类图: 抽象化(Abstraction)角色:抽象化给出的定义,并保存 一 ...

  8. [JAVA设计模式]第三部分:结构模式

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. php设计模式(二):结构模式

    上一篇我们介绍了设计模式的特性并且详细讲解了4种创建型模式,创建型模式是负责如何产生对象实例的,现在我们继续来给大家介绍结构型模式. 一.什么是结构型模式? 结构型模式是解析类和对象的内部结构和外部组 ...

  10. 设计模式GOF23(行为型模式)

    场景: – 公司里面,报销个单据需要经过流程: • 申请人填单申请,申请给经理 • 小于1000,经理审查. • 超过1000,交给总经理审批. • 总经理审批通过 – 公司里面,请假条的审批过程: ...

随机推荐

  1. [PHP]算法-旋转数组的最小值的PHP实现

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组 ...

  2. 【Linux命令】top命令

    一.简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,常用于服务端性能分析. 二.使用 1.查看进程内线程情况 top -Hp 2556(2556为进程号)找 ...

  3. Heaps(Contest2080 - 湖南多校对抗赛(2015.05.10)(国防科大学校赛决赛-Semilive)+scu1616)

    Problem H: Heaps Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 48  Solved: 9[Submit][Status][Web Bo ...

  4. Linux服务器配置

    配置ssh: 1. 查看22端口是否监听 netstat -antu | grep :22 2. 安装ssh服务 sudo apt-get install ssh 3. 再次查看22端口 安装apac ...

  5. Springboot@Configuration和@Bean详解

    Springboot@Configuration和@Bean详解 一.@Configuration @Target({ElementType.TYPE}) @Retention(RetentionPo ...

  6. JQuery禁止/恢复按钮readonly和disabled小结

    禁止/恢复按钮 其实就是更改 <input> 的属性. 禁用 id 为 btn 的按钮:  代码如下 复制代码 $("#btn").attr({"disabl ...

  7. CSS 定位与Z-index

    position: static   Z-index 固定是0 position: absolute/relative/fixed   Z-index 有效 在层叠显示上,所有static定位元素看作 ...

  8. 简单选择排序算法的C++实现

    简单选择排序采用最简单的选择方法,即在剩余序列中选出最小(或最大)的关键字,和剩余序列的第一个关键字交换位置,依次选择下去,直至使整个序列有序. 算法中两层循环的执行次数和初始序列没有关系,第二层循环 ...

  9. 自动化测试 接口自动化及UI自动化测试平台设计演示

    接口自动化及UI自动化测试平台设计演示   by:授客  QQ:1033553122 欢迎加入全国软件测试交流qq群:7156436 大家好,我是授客. 本视频意在分享个人,基于Python,Djan ...

  10. [Objective-C] Copy 和 MutableCopy

    看了几篇文章,因为文章很新手向,所以内容很繁琐.故整理一下重点,写了测试程序去了解几个知识点,不讨论基本概念.新博客wossoneri.com传送门 非集合类对象的copy与mutableCopy / ...