原文:http://www.runoob.com/design-pattern/
少许个人理解,如有错误请指出。欢迎一起讨论。(本文基本摘抄)

定义:
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。(主要功能:过滤)

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

过滤器模式的 UML 图

步骤 1
创建一个类,在该类上应用标准。
Person.java

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)创建一个接口。
Criteria.java

import java.util.List;public interface Criteria {public List<Person> meetCriteria(List<Person> persons);
}

步骤 3
创建实现了 Criteria 接口的实体类。
CriteriaMale.java

import java.util.ArrayList;
import java.util.List;public class CriteriaMale implements Criteria {@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> malePersons = new ArrayList<Person>(); for (Person person : persons) {if(person.getGender().equalsIgnoreCase("MALE")){malePersons.add(person);}}return malePersons;}
}

CriteriaFemale.java

import java.util.ArrayList;
import java.util.List;public class CriteriaFemale implements Criteria {@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> femalePersons = new ArrayList<Person>(); for (Person person : persons) {if(person.getGender().equalsIgnoreCase("FEMALE")){femalePersons.add(person);}}return femalePersons;}
}

CriteriaSingle.java

import java.util.ArrayList;
import java.util.List;public class CriteriaSingle implements Criteria {@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> singlePersons = new ArrayList<Person>(); for (Person person : persons) {if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){singlePersons.add(person);}}return singlePersons;}
}

AndCriteria.java

import java.util.List;public class AndCriteria implements Criteria {private Criteria criteria;private Criteria otherCriteria;public AndCriteria(Criteria criteria, Criteria otherCriteria) {this.criteria = criteria;this.otherCriteria = otherCriteria; }@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);       return otherCriteria.meetCriteria(firstCriteriaPersons);}
}

OrCriteria.java

import java.util.List;public class OrCriteria implements Criteria {private Criteria criteria;private Criteria otherCriteria;public OrCriteria(Criteria criteria, Criteria otherCriteria) {this.criteria = criteria;this.otherCriteria = otherCriteria; }@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> firstCriteriaItems = criteria.meetCriteria(persons);List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);for (Person person : otherCriteriaItems) {if(!firstCriteriaItems.contains(person)){firstCriteriaItems.add(person);}} return firstCriteriaItems;}
}

步骤4
使用不同的标准(Criteria)和它们的结合来过滤 Person 对象的列表。
CriteriaPatternDemo.java

import java.util.ArrayList;
import java.util.List;public class CriteriaPatternDemo {public static void main(String[] args) {List<Person> persons = new ArrayList<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);System.out.println("Males: ");printPersons(male.meetCriteria(persons));System.out.println("\nFemales: ");printPersons(female.meetCriteria(persons));System.out.println("\nSingle Males: ");printPersons(singleMale.meetCriteria(persons));System.out.println("\nSingle Or Females: ");printPersons(singleOrFemale.meetCriteria(persons));}public static void printPersons(List<Person> persons){for (Person person : persons) {System.out.println("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 ]

and过滤逻辑:先拿标准一过滤,得到过滤一次后的person列表,再继续进行第二次过滤。
or过滤逻辑:先用标准一过滤得到person列表1,再用标准二过滤得到person列表2,再讲列表取并集,如果列表1中含有列表二没有的item,add到列表二,列表二是最终的并集。

设计模式笔记八:过滤器模式相关推荐

  1. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  2. 设计模式(八)----过滤器模式

    概述 过滤器模式(Filter Pattern),又叫标准模式(Criteria Pattern),是一种结构型模式. 这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们 ...

  3. 设计模式笔记:命令模式

    首先看看命令模式的定义:命令模式将请求封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持撤销的操作. 所谓参数化,我的理解是实际执行的对象,比如light(电灯).strer ...

  4. 设计模式笔记(18)---迭代器模式(行为型)

    Gof定义 提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露该对象的内部表示. 动机 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可 ...

  5. 设计模式笔记(2)---单件模式(创建型)

    Gof 定义 保证一个类仅有一个实例,并提供一个该实例的全局访问点. 动机 保证在系统中只存在一个实例,这样才能保证逻辑的正确性和良好的效率. 单件模式单线程环境下实现 看下面一段代码: public ...

  6. 设计模式笔记之七 (桥接模式)

    桥接模式 桥接模式就是把影响事物对象的多个因素抽象出来从而使两者解偶,那么就能动态的加载变化的因素. 好吧,这个定义很抽象,我们还是来聊下具体的事物. 最近我们实验室因为一系列的设计模式改进,所以竞争 ...

  7. 设计模式笔记[四种模式+四种原则]

    A.简单工厂 :用一个单独的类来做这个创建实例的过程,这就是工厂 不符合开-封闭原刚,每次扩展都要更改工厂类 [计算器] 1.cbxType.Items.AddRange(new object[] { ...

  8. 尚硅谷设计模式笔记-装饰者模式

    文章目录 一.需求 二.装饰者方法 三.装饰者模式的JDK应用 笔记来源: 尚硅谷 一.需求 星巴克咖啡订单项目(咖啡馆) : 咖啡种类/单品咖啡: Espresso(意大利浓咖啡). ShortBl ...

  9. Head First 设计模式笔记 5.命令模式

    文章目录 设计要求 命令模式 实际实现 命令模式具体应用 设计要求 小明接到了新任务,要求设计一个遥控器,这个遥控器上面有七个插槽,每个插槽都有对应的开和关按钮.要求每个都能控制任意家电如灯,电视,电 ...

最新文章

  1. Aspose.Words导出图片 表格 Interop.Word
  2. linux的临时页表映射问题
  3. 第十三周项目-交通工具类程序
  4. ASP.NET Page执行顺序如:OnPreInit()、OnInit()
  5. 王爽 16 位汇编语言学习记录
  6. 计算机网络(谢希仁第八版)第四章:网络层
  7. 想到Exchanger N parties的一种用法
  8. java对mysql的简单操作——增加数据
  9. lisp的vla函数画矩形_利用Lisp做Tin三角网建模(源代码)
  10. c语言 二进制输出_C语言编译器
  11. 64位x86的函数调用栈布局
  12. ubnutu更换合适源(阿里源)
  13. python语法学习第五天--函数(2)
  14. android重写view和viewgroup的区别
  15. 第二章 过程域——技术解决方案
  16. php微信公众号群发,php实现微信公众号无限群发,php信公众群发
  17. 大工计算机英语考试,大工15春《专业英语(计算机英语)》在线测试123
  18. hexo(sakura)仿gitee添加文章贡献度日历图(echarts)
  19. 截取邮箱后缀名,拼接访问邮箱地址
  20. 微信聊天记录恢复记录

热门文章

  1. 如何修改php的网页文件,php如何修改php文件内容
  2. C语言之原码、反码和补码
  3. Long Way To Go 之 Python 5 (2)
  4. 团队作业4——第一次项目冲刺(Alpha版本)第三天
  5. 关于数据库记录排序问题
  6. UVa 1640 (计数) The Counting Problem
  7. subline修改字体大小和空格问题
  8. 并查集——村村通(洛谷 P1536)
  9. c语言期末考试复习题,C语言期末考试复习资料 计算机等级考试复习题目
  10. linux复制后权限变了,linux系统(centos debian freebsd等)如何拷贝数据并保持原来的属性(权限 属主)不变?...