概述

过滤器模式(Filter Pattern),又叫标准模式(Criteria Pattern),是一种结构型模式。
这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来,它可结合多个标准来获得单一标准。
优点:简单,解耦,使用方便。
使用场景:需要进行筛选时。

实例

下面将创建Student对象,Filter接口和该接口的实现类,基于各种标准和它们的组合来过滤Student对象的列表(如统计有多少男生,一年级的学生等)。
创建Student类
该类属性有姓名、性别和年级。

public class Student {private String name;private String gender;private String grade;//省略setter和getter方法,无参构造和带参构造
}

创建过滤器接口

public interface Filter {//定义过滤方法public List<Student> doFilt(List<Student> students);
}

创建Filter接口的实现类
男生过滤器

public class MaleFilter implements Filter {public List<Student> doFilt(List<Student> students) {List<Student> students2 = new ArrayList<Student>();for(Student student : students) {if(student.getGender().equalsIgnoreCase("男")) {students2.add(student);}}return students2;}
}

女生过滤器

public class FemaleFilter implements Filter {public List<Student> doFilt(List<Student> students) {List<Student> students2 = new ArrayList<Student>();for(Student student : students) {if(student.getGender().equalsIgnoreCase("女")) {students2.add(student);}}return students2;}
}

一年级学生过滤器

public class FirstGradeFilter implements Filter {public List<Student> doFilt(List<Student> students) {List<Student> students2 = new ArrayList<Student>();for(Student student : students) {if(student.getGrade().equalsIgnoreCase("一年级")) {students2.add(student);}}return students2;}
}

二年级学生过滤器

public class SecondGradeFilter implements Filter {public List<Student> doFilt(List<Student> students) {List<Student> students2 = new ArrayList<Student>();for(Student student : students) {if(student.getGrade().equalsIgnoreCase("二年级")) {students2.add(student);}}return students2;}
}

与过滤器(交集)

public class AndFilter implements Filter {private Filter filter1;private Filter filter2;public AndFilter(Filter filter1,Filter filter2) {this.filter1 = filter1;this.filter2 = filter2;}public List<Student> doFilt(List<Student> students) {List<Student> students2 = filter1.doFilt(students);return filter2.doFilt(students2);}
}

或过滤器(并集)

public class OrFilter implements Filter {private Filter filter1;private Filter filter2;public OrFilter(Filter filter1,Filter filter2) {this.filter1 = filter1;this.filter2 = filter2;}public List<Student> doFilt(List<Student> students) {List<Student> students1 = filter1.doFilt(students);List<Student> students2 = filter2.doFilt(students);for(Student student : students2) {if(!students1.contains(student)) {students1.add(student);}}return students1;}
}

测试类

public class FilterPatternDemo {public static void main(String[] args) {//定义对象列表List<Student> students = new ArrayList<Student>();students.add(new Student("叶凡","男","一年级"));students.add(new Student("无始","男","一年级"));students.add(new Student("狠人","女","一年级"));students.add(new Student("荒","男","二年级"));students.add(new Student("云曦","女","二年级"));students.add(new Student("火灵儿","女","二年级"));//定义过滤器对象//男生过滤器Filter maleFilter = new MaleFilter();//女生过滤器Filter femaleFilter = new FemaleFilter();//一年级学生过滤器Filter firstGradeFilter = new FirstGradeFilter();//二年级学生过滤器Filter secondGradeFilter = new SecondGradeFilter();//一年级男生过滤器Filter maleAndFirstGradeFilter = new MaleAndFirstGradeFilter(maleFilter,firstGradeFilter);//女生或二年级学生过滤器Filter femaleOrSecondGradeFilter = new FemaleOrSecondGradeFilter(femaleFilter,secondGradeFilter);//使用不同的过滤器对对象列表进行过滤,根据需求进行统计//统计所有男生System.out.println("男生");List<Student> students1 = maleFilter(students);printStudent(students1);System.out.println("==========================");//统计所有二年级的学生System.out.println("二年级学生");List<Student> students2 = secondGradeFilter(students);printStudent(students2);System.out.println("==========================");//统计一年级的男生(交集)System.out.println("一年级男生");List<Student> students3 = maleAndFirstGradeFilter(students);printStudent(students3);System.out.println("==========================");//统计女生和二年级的学生(并集)System.out.println("女生和二年级学生");List<Student> students4 = femaleOrSecondGradeFilter(students);printStudent(students4);System.out.println("==========================");}//打印学生信息方法public static void printStudent(List<Student> students) {for(Student student : students) {System.out.println("姓名:" + student.getName() + ",性别:" + student.getGender() + ",年级:" + student.getGrade());}}
}

打印结果为

通过上面的实例,可以发现,过滤器模式其实很简单,制定过滤规则,然后根据指定的标准进行过滤,得到符合条件的数据。但在构建过滤规则时较为繁琐,不过在java8之后,可使用stream流的方式更加方便地进行规则制定。

设计模式(八)----过滤器模式相关推荐

  1. 过滤器用到了java哪个模式_设计模式之过滤器模式——Java语言描述

    过滤器模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来 实现 创建一个Person对象.Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列 ...

  2. 行为型设计模式(八)命令模式【王者荣耀的服务端实现】

    目录 一.概念及原理 二.具体实例 2.1 游戏开发背景知识 2.2 线程内轮询接收请求和处理请求实现 三.命令模式 VS 策略模式 四.小结 五.参考链接 一.概念及原理 命令模式的英文翻译是 Co ...

  3. 7.泡妞与设计模式(八)模板模式

    TEMPLATE METHOD 模板模式 模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方 ...

  4. 设计模式之过滤器模式(摘自菜鸟驿站)

    Filter Pattern,允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把他们链接起来,这种设计模式属于结构性设计模式,它结合多个标准来获得单一标准. 创建一个类,在该类上应用 ...

  5. 设计模式笔记八:过滤器模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论.(本文基本摘抄) 定义: 过滤器模式(Filter Pattern)或标准 ...

  6. 【白话设计模式八】命令模式(Command)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

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

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

  8. 从真实项目中抠出来的设计模式——第二篇:过滤器模式

    一:实际场景介绍 我们在给用户做订单催付通知的时候,会有这样的一种场景,用户在系统后台设置一组可以催付的规则,比如说订单金额大于xx元,非黑名单用户,来自 哪个地区,已购买过某个商品,指定某个营销活动 ...

  9. java filter 模式,Java设计模式----过滤器模式(挑三拣四)

    过滤器模式 描述 拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理.定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上.过 ...

最新文章

  1. 前端设计模式责任链模式
  2. 题目1033:继续xxx定律
  3. Tengine(nginx) 搭建Tomcat集群
  4. commons-lang常用工具类StringEscapeUtils使用--转
  5. 哎!又要过年了,程序员最怕问到什么?
  6. 按钮图片拉伸_图片墙有多香?高手都在用的PPT封面制作技巧!
  7. 【HDU - 5585】Numbers (水题,数学,数论)
  8. md5加密算法的C(C++)代码实现
  9. 从哪些角度进行手机软件测试
  10. Python3.7安装教程
  11. 以太网未识别的网络win10_Win10以太网未识别的网络怎么办
  12. 微众银行·We研究2021年最新大调研报告“健康险专题” : 用户保险消费的三个改变
  13. 手机端API框架流程(学习笔记)
  14. ThinkPad T450s笔记本禁用触摸板
  15. 硬盘参数调整命令hdparm
  16. 学习【菜鸟教程】【C++ 类 对象】【内联函数】(例子简单,评论难懂)
  17. Chrome和Firebox快捷键
  18. 【python学习】-字典学习(访问字典所有键与值、修改与更新字典、删除字典)
  19. 高德地图 点击获取坐标
  20. Vue+SpringBoot+ElementUI实战学生管理系统-10.学生管理模块

热门文章

  1. java实现后端身份验证的Token令牌
  2. 11月5G手机出货量超500万部,4款5G新机上市
  3. 正则引擎入门——基于虚拟机的正则匹配(二)
  4. shell基础-04 数组(定义数组、查看数组、访问数组、删除数组、关联数组、二维数组)
  5. L2正则化(Regularization)
  6. windows RMS 部署
  7. eclipse乱码 切换eclipse后出现菜单栏乱码问题解决办法
  8. 两台计算机互联,其中一台能ping通另一台却无法连通,执行Ping成功而网络无法使用 的解决
  9. 设置IE10用兼容模式打开站点
  10. 移远EC20 WINDOWS下安装驱动及开机自动拨号上网