设计模式(八)----过滤器模式
概述
过滤器模式(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流的方式更加方便地进行规则制定。
设计模式(八)----过滤器模式相关推荐
- 过滤器用到了java哪个模式_设计模式之过滤器模式——Java语言描述
过滤器模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来 实现 创建一个Person对象.Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列 ...
- 行为型设计模式(八)命令模式【王者荣耀的服务端实现】
目录 一.概念及原理 二.具体实例 2.1 游戏开发背景知识 2.2 线程内轮询接收请求和处理请求实现 三.命令模式 VS 策略模式 四.小结 五.参考链接 一.概念及原理 命令模式的英文翻译是 Co ...
- 7.泡妞与设计模式(八)模板模式
TEMPLATE METHOD 模板模式 模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方 ...
- 设计模式之过滤器模式(摘自菜鸟驿站)
Filter Pattern,允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把他们链接起来,这种设计模式属于结构性设计模式,它结合多个标准来获得单一标准. 创建一个类,在该类上应用 ...
- 设计模式笔记八:过滤器模式
原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论.(本文基本摘抄) 定义: 过滤器模式(Filter Pattern)或标准 ...
- 【白话设计模式八】命令模式(Command)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 从真实项目中抠出来的设计模式——第二篇:过滤器模式
一:实际场景介绍 我们在给用户做订单催付通知的时候,会有这样的一种场景,用户在系统后台设置一组可以催付的规则,比如说订单金额大于xx元,非黑名单用户,来自 哪个地区,已购买过某个商品,指定某个营销活动 ...
- java filter 模式,Java设计模式----过滤器模式(挑三拣四)
过滤器模式 描述 拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理.定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上.过 ...
最新文章
- 前端设计模式责任链模式
- 题目1033:继续xxx定律
- Tengine(nginx) 搭建Tomcat集群
- commons-lang常用工具类StringEscapeUtils使用--转
- 哎!又要过年了,程序员最怕问到什么?
- 按钮图片拉伸_图片墙有多香?高手都在用的PPT封面制作技巧!
- 【HDU - 5585】Numbers (水题,数学,数论)
- md5加密算法的C(C++)代码实现
- 从哪些角度进行手机软件测试
- Python3.7安装教程
- 以太网未识别的网络win10_Win10以太网未识别的网络怎么办
- 微众银行·We研究2021年最新大调研报告“健康险专题” : 用户保险消费的三个改变
- 手机端API框架流程(学习笔记)
- ThinkPad T450s笔记本禁用触摸板
- 硬盘参数调整命令hdparm
- 学习【菜鸟教程】【C++ 类 对象】【内联函数】(例子简单,评论难懂)
- Chrome和Firebox快捷键
- 【python学习】-字典学习(访问字典所有键与值、修改与更新字典、删除字典)
- 高德地图 点击获取坐标
- Vue+SpringBoot+ElementUI实战学生管理系统-10.学生管理模块