过滤器模式

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

实现

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

步骤 1

创建一个类,在该类上应用标准。
Person.java
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
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
[Java] 纯文本查看 复制代码
1
2
3
4
5
import java.util.List;
 
    public interface Criteria {
       public List<Person> meetCriteria(List<Person> persons);
    }

步骤 3

创建实现了 Criteria 接口的实体类。
CriteriaMale.java
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
import java.util.ArrayList;
    import java.util.List;
 
    public class CriteriaMale implements Criteria {
 
       @Override
       public 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
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
import java.util.ArrayList;
    import java.util.List;
 
    public class CriteriaFemale implements Criteria {
 
       @Override
       public 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
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
import java.util.ArrayList;
    import java.util.List;
 
    public class CriteriaSingle implements Criteria {
 
       @Override
       public 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
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
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;
       }
 
       @Override
       public List<Person> meetCriteria(List<Person> persons) {
          List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);     
          return otherCriteria.meetCriteria(firstCriteriaPersons);
       }
    }
OrCriteria.java
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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;
       }
 
       @Override
       public 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
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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

验证输出。
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
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 ]
更多技术资讯可关注:itheimaGZ获取

Java设计模-过滤器模式的更多相关文章

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

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

  2. java设计优化--代理模式

    代理模式使用代理对象完成用户的请求,屏蔽用户对真实对象的访问. 代理模式的用途很多,比如因为安全原因,需要屏蔽客户端直接访问真实对象:或者在远程调用中,需要使用代理对象处理远程方法中的技术细节:或者为 ...

  3. java设计模——反射的应用 (利用反射来去除if判断语句)

    利用反射来去除if判断语句 我的以前写的一个查分系统,就是部长让我写的那个,使用一个分发器(函数),他会根据传递进来的字符串参数调用不同的方. If(“add”.equalsIgnoreCase(fu ...

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

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

  5. Java计模模式之六 ----- 组合模式和过滤器模式

    前言 在上一篇中我们学习了结构型模式的外观模式和装饰器模式.本篇则来学习下组合模式和过滤器模式. 组合模式 简介 组合模式是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来 ...

  6. Java拦截过滤器模式

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

  7. java设计模式之原型模式

    原型模式概念 该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.java中复制通过clone()实现的.clone中涉及深.浅复制.深.浅复制的概念如下: ⑴浅复制 ...

  8. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  9. JAVA 23种开发模式详解(代码举例)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

随机推荐

  1. python Mysql数据库连接池组件封装(转载)

    以前一直在用Java来开发,数据库连接池等都是有组件封装好的,直接使用即可,最近在尝试Python的学习,碰到了和数据库打交道的问题,和数据库打交道我们都知道,数据库连接池必不可少,不然要么就是程序异 ...

  2. CodeForces-1076B Divisor Subtraction 找规律

    题目链接:https://vjudge.net/problem/CodeForces-1076B 题意: 题目要求给定一个数,要求每次减去其最小素因数(既是素数又是其因数),问直到n=0需要做几次运算 ...

  3. CSS——fixed 固定定位相对于父容器

    position:fixed 固定定位 用 left top 都是相对于浏览器的. 我今天想给网页做一个固定定位的导航 偶然间发现.可以用margin 相对于父容器定位. 小伙伴们可以试试. 不用le ...

  4. while read line do done < file

    zzx@zzx120:~/test1$ cat file.txt    1122zzx@zzx120:~/test1$ cat ./read.sh #!/bin/bashwhile read line ...

  5. 86.QuerySet API常用的方法详解:get方法

    get方法的查询条件只能有一条数据满足,如果匹配到多条数据都满足,就会报错:如果没有匹配到满足条件的数据,也会报错. 示例代码如下: from django.http import HttpRespo ...

  6. uni-app: 如何实现增量更新功能?

    都知道,很多APP都有增量更新功能,Uni APP也是在今年初,推出了增量更新功能,今天我们就来学习一波. 当然,很多应用市场为了防止开发者不经市场审核许可,给用户提供违法内容,对增量更新大多持排斥态 ...

  7. 201604-1 折点计数 Java

    思路: 这个题要小心考虑不全.左右两边都比这个数小 或者 左右两边都比这个数大 import java.util.Scanner; public class Main { public static ...

  8. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第一天】

    本人做过一年的MATLAB编程和简单维护过VB和C++的项目.是跟着网上获得的黑马的Java双元视频课来自学入门Java知识和常用框架的使用. 淘淘商城(SpringMVC+Spring+Mybati ...

  9. MySQL--OPTIMIZE TABLE碎片整理

    参考:http://blog.51yip.com/mysql/1222.html BLOB和TEXT值会引起一些性能问题,特别是在执行了大量的删除操作时.删除操作会在数据表中留下很大的空洞,以后填入这 ...

  10. ILSVRC2012下载

    http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.tarhttp://www.image-net.or ...