1、模式简介

  过滤器模式(Filter)也叫标准模式(Criteria),这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。

2、实例

这个实例的需求如下:

  Person类有三个属性:姓名(Name)、性别(Gender)和婚姻情况(Marital),我们的系统中的一些功能需要对这些属性进行筛选,比如:

  • 得到所有的男性;
  • 得到所有的女性;
  • 得到所有还单身的人;
  • 得到所有已婚的人。

  系统还希望能够将这些条件组合起来进行筛选,比如:

  • 得到所有已婚男性;
  • 得到所有单身女性;
  • 得到所有已婚的人或女性;

分析:

  要解决这个问题,我们可以使用过滤器模式。

代码:

  Person类中的代码:

  1. public class Person {
  2. private String name; // 姓名
  3. private String gender; // 性别
  4. private String marital; // 婚姻情况
  5.  
  6. public Person(String name, String gender, String marital) {
  7. this.name = name;
  8. this.gender = gender;
  9. this.marital = marital;
  10. }
  11.  
  12. public String getName() {
  13. return name;
  14. }
  15.  
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19.  
  20. public String getGender() {
  21. return gender;
  22. }
  23.  
  24. public void setGender(String gender) {
  25. this.gender = gender;
  26. }
  27.  
  28. public String getMarital() {
  29. return marital;
  30. }
  31.  
  32. public void setMarital(String marital) {
  33. this.marital = marital;
  34. }
  35.  
  36. @Override
  37. public String toString() {
  38. return "Person [name=" + name + ",gender=" + gender + ", marital=" + marital + "]";
  39. }
  40. }

  Filter接口中的代码:

  1. public interface Filter {
  2. // 根据传过来的Person列表,根据一定的条件过滤,得到目标集合
  3. List<Person> filter(List<Person> persons);
  4. }

  MaleFilter类中的代码:

  1. public class MaleFilter implements Filter {
  2.  
  3. @Override
  4. public List<Person> filter(List<Person> persons) {
  5. List<Person> result = new ArrayList<>();
  6. for (Person person : persons) {
  7. if ("MALE".equalsIgnoreCase(person.getGender())) {
  8. result.add(person);
  9. }
  10. }
  11. return result;
  12. }
  13. }

  处理“并且”逻辑的过滤器类FilterAnd类中的代码:

  1. public class FilterAnd implements Filter {
  2. private Filter filter;
  3. private Filter otherFilter;
  4.  
  5. public FilterAnd(Filter filter, Filter otherFilter) {
  6. this.filter = filter;
  7. this.otherFilter = otherFilter;
  8. }
  9.  
  10. @Override
  11. public List<Person> filter(List<Person> persons) {
  12. List<Person> tmpList = filter.filter(persons);
  13. return otherFilter.filter(tmpList);
  14. }
  15. }

  处理“或者”逻辑的过滤器类FilterOr类中的代码:

  1. public class FilterOr implements Filter {
  2. private Filter filter;
  3. private Filter otherFilter;
  4.  
  5. public FilterOr(Filter filter, Filter otherFilter) {
  6. this.filter = filter;
  7. this.otherFilter = otherFilter;
  8. }
  9.  
  10. @Override
  11. public List<Person> filter(List<Person> persons) {
  12. List<Person> tmpList1 = filter.filter(persons);
  13. List<Person> tmpList2 = otherFilter.filter(persons);
  14. for (Person person : tmpList2) {
  15. if (!tmpList1.contains(person)) {
  16. tmpList1.add(person);
  17. }
  18. }
  19. return tmpList1;
  20. }
  21. }

  测试类Test中的代码:

  1. public class Test {
  2. public static void main(String[] args) {
  3. // 初始化数据
  4. List<Person> persons = new ArrayList<>();
  5. persons.add(new Person("霍一", "FEMALE", "MARRIED"));
  6. persons.add(new Person("邓二", "MALE", "MARRIED"));
  7. persons.add(new Person("张三", "MALE", "SINGLE"));
  8. persons.add(new Person("李四", "FEMALE", "MARRIED"));
  9. persons.add(new Person("王五", "MALE", "SINGLE"));
  10. persons.add(new Person("赵六", "FEMALE", "SINGLE"));
  11. persons.add(new Person("孙七", "MALE", "SINGLE"));
  12. persons.add(new Person("罗八", "MALE", "MARRIED"));
  13. persons.add(new Person("刘九", "FEMALE", "SINGLE"));
  14. persons.add(new Person("史十", "FEMALE", "SINGLE"));
  15. // 打印出所有男性的信息
  16. System.out.println("---------------------所有男性---------------------");
  17. List<Person> maleList = new MaleFilter().filter(persons);
  18. printList(maleList);
  19. // 打印出所有单身的信息
  20. System.out.println("---------------------所有单身---------------------");
  21. List<Person> singleList = new SingleFilter().filter(persons);
  22. printList(singleList);
  23. // 打印出所有已婚女性的信息
  24. System.out.println("--------------------所有已婚女性-------------------");
  25. List<Person> marriedFemaleList = new FilterAnd(new MarriedFilter(), new FemaleFilter()).filter(persons);
  26. printList(marriedFemaleList);
  27. // 打印出所有单身或女性的信息
  28. System.out.println("-------------------所有单身或女性------------------");
  29. List<Person> singleOrFemaleList = new FilterOr(new SingleFilter(), new FemaleFilter()).filter(persons);
  30. printList(singleOrFemaleList);
  31. }
  32.  
  33. // 打印列表中的数据信息
  34. private static void printList(List<Person> list) {
  35. for (Person person : list) {
  36. System.out.println(person.toString());
  37. }
  38. }
  39. }

  测试代码如下图所示:

  最后贴出过滤器模式的GitHub代码:【GitHub - Filter】

【设计模式 - 7】之过滤器模式(Filter)的更多相关文章

  1. 基础设计模式-03 从过滤器(Filter)校验链学习职责链模式

    1.职责链路模式 1.1UML图 1.2 职责链路模式的概念 为了避免处理对象的耦合关系,将对象连成一个链,沿着这个链进行访问,直到有一个对象处理位置: 1.3 优点 1.按照一定的顺序执行判断: 2 ...

  2. 设计模式系列之过滤器模式(Chriteria Pattern)

    过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这种类 ...

  3. 设计模式のFilterPattern(过滤器模式)----结构模式

    一.产生背景 我们有一堆“人”的对象,我们应该怎么选择出其中的男性.女性或者其他类型的呢?这时候我们可以用过滤器模式 二.通常做法 我们将创建一个 Person 对象.Criteria 接口和实现了该 ...

  4. Java拦截过滤器模式

    当我们想要对应用程序的请求或响应进行一些预处理/后处理时,使用截取过滤器设计模式. 在将请求传递到实际目标应用程序之前,在请求上定义和应用过滤器. 过滤器可以进行请求的认证/授权/日志记录或跟踪,然后 ...

  5. 过滤器模式(Filter Pattern)

    过滤器模式 一.什么是过滤器模式   过滤器模式(Filter Pattern),这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这种类型的设计模式属于结构型 ...

  6. 设计模式之过滤器模式(php实现)

    /** * github地址:https://github.com/ZQCard/design_pattern * 过滤器模式(Filter Pattern)或标准模式(Criteria Patter ...

  7. [07]Go设计模式:过滤器模式(FilterPattern)

    目录 过滤器模式 一.简介 二.代码 三.参考链接 过滤器模式 一.简介 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使 ...

  8. Java设计模式应用——过滤器模式

    storm引擎计算出一批中间告警结果,会发送一条kafka消息给告警入库服务,告警入库服务接收到kafka消息后读取中间告警文件,经过一系列处理后把最终告警存入mysql中. 实际上,中间告警结果可能 ...

  9. 设计模式之过滤器模式——Java语言描述

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

随机推荐

  1. Linux 信号量同步编程

    前一篇文章概述了Linux 系统中信号量互斥编程,这篇文章正好是前一篇的姊妹篇----信号量同步.说它们是姊妹篇是因为它们都是利用了内核的信号量机制实现了进程间的通信.因为两者所解决的问题不同,因此它 ...

  2. javascript 学习笔记之面向对象编程(一):类的实现

    ~~想是一回事,做是一回事,写出来又是一回事~~一直以来,从事C++更多的是VC++多一些,从面向过程到面向对象的转变,让我对OO的编程思想有些偏爱,将一个客观存在的规律抽象出来总是让人比较兴奋,通过 ...

  3. Shortcut Collapse project or projects in the Solution Explorer Microsoft Visual Studio 2008

    The standard windows keyboard shortcuts for expanding and collapsing treeviews are: Numeric Keypad * ...

  4. 用Django搭建个人博客—(1)

    业精于勤荒于嬉,形成于思毁于随. 本阶段的任务小记: 简单介绍一下Django的使用,创建项目和一个app 简单介绍一下Django的settings.py文件的相关配置 整合数据库到自己的博客系统中 ...

  5. Word 2016 test

    Word 2016 test    

  6. maven web项目不能创建src/main/java等文件夹的问题

    eclipse创建maevn web项目,在选择maven_archetype_webapp原型后,默认只有src/main/resources这个Source Floder.  按照maven目录结 ...

  7. linux解压命令

    .tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gun ...

  8. Android如何正确的保存文件

    在Android 官方开发文档中有一篇文档来介绍如何保存应用的数据,但笔者用过很多程序(从知名的到不知名的)处理的都不是很完美,或者 没有按照Android 开发团队建议的方式去保存他们应用的数据.当 ...

  9. UML-图的意义

    在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization),关联(Association),聚合(Aggregation),组合(Composit ...

  10. 【HDOJ】2386 Dart Challenge

    纯粹母函数+滚动数组,水之. /* 2386 */ #include <iostream> #include <string> #include <map> #in ...