过滤器模式

过滤器模式(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. 小程序转义字符去空格&nbsp;

    <text ].specInfo}}</text> 在微信小程序开发过程中,有时候会用到常用的一些特殊字符如:‘<’.‘>’.‘&’.‘空格’等,微信小程序同样支 ...

  2. 201771010123汪慧和《面向对象程序设计Java》第十一周实验总结

    一.理论部分 1.栈 (1)栈是一种特殊的线性表,是一种后进先出的结构.(2)栈是限定仅在表尾进行插入和删除运算的线性表,表尾称为栈顶,表头称为栈底.(3)栈的物理存储可以用顺序存储结构,也可以用链式 ...

  3. Feign整合测试

    1.测试使用 (1)服务调用方引入依赖 <dependency> <groupId>org.springframework.cloud</groupId> < ...

  4. 3. laravel 5.5 多子域名 + dingo + jwt 简单环境搭建

    环境介绍 laravel 5.5.* + php 7.2 + mysql 5.7.27 1. 创建 laravel 项目 (自行 配置一下域名 如果 不会 请参考laravel 的第一篇文章) com ...

  5. Python笔记_第四篇_高阶编程_检测_1.对函数进行单元检测

    1. 对函数进行单元检测: 单元检测: 作用:用来对一个函数.一个类.一个模块进行正确性校验工作. 结果: * 单元测试通过,说明我们测试函数的功能正确. * 单元测试不通过,说明函数有BUG,要么测 ...

  6. 吴裕雄--天生自然Linux操作系统:Linux 云服务器

    自己安装服务器还是麻烦了些,现在一般都推荐大家使用云服务器,比较方便,价格也不贵. 腾讯云 以下几款性价比非常高,有几款是需要抢购的,大家看好时间基本能拿到. 1.1核2G 99/年,可以用来学习,L ...

  7. LGOJ3879 TJOI2010 阅读理解

    不可否认,\(TJOI\)的这道题确实不难 为本题写博客的唯一原因就是 \(STL\)大法好!!!! Description link 不简述题意了,因为实在是简单 Solution 直接\(map& ...

  8. Java之线程通信的方法

    /** * 线程通信的例子:使用两个线程打印 1-100.线程1, 线程2 交替打印 * * 涉及到的三个方法: * wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器. * no ...

  9. 项目开发git-短信验证-redis数据库

    项目开发git操作 基本流程 """ 1.开发前,拉一次远程仓库 2.工作区进行开发 3.将开发结果提交到本地版本库 - git status查看时没有待处理的事件 4. ...

  10. 面向对象 part6 继承

    继承 js实现的是实现继承/也就是继承实际的方法 //主要依赖:原型链 //基本思路: 就是一个引用类型继承另一个引用类型的属性和方法 详细:构造函数,实例,原型之间的关系.每个构造函数都有一个原型对 ...