过滤器模式

过滤器模式(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. post表单、json接口

    package com.lv.qggz.man.dhht.api.typesetting; import com.lv.qggz.man.dhht.api.typesetting.vo.UVO;imp ...

  2. SQL基础教程(第2版)第3章 聚合与排序:练习题

    存在以下 个错误. .使用了字符类型的列(product_name)作为 SUM 函数的参数. >> 解答 SUM 函数只能使用数值类型的列作为参数. . WHERE 子句写在了 GROU ...

  3. [Python Cookbook]Pandas: How to increase columns for DataFrame?Join/Concat

    1. Combine Two Series series1=pd.Series([1,2,3],name='s1') series2=pd.Series([4,5,6],name='s2') df = ...

  4. 【leetcode困难】968. 监控二叉树

    968. 监控二叉树 瞎**分析评论区Rui大佬的答案,这题想直接递归return min还是有坑的,分计数和状态.有个状态转换的思想

  5. String 字符串拼接

    字符串拼接有两个方法 第一中 var sad = "happy" var variable = "you"+sad +"" variable ...

  6. awk中传参方式

    结合编辑数据文件的shell脚本学习awk传参方式,该脚本功能: a.取VIDEOUSR_11082017_0102_ONLINE_STASTIC.dat文件中第87个字段的低8位: b.将每行数据的 ...

  7. [CF百场计划]#3 Educational Codeforces Round 82 (Rated for Div. 2)

    A. Erasing Zeroes Description You are given a string \(s\). Each character is either 0 or 1. You wan ...

  8. java 面向对象概述, 函数解析

    函数:class FunctionDemo { public static void main(String[] args) { /* int x = 4; System.out.println(x* ...

  9. beta函数与置信度估计

    可信度的估计 二项分布中的\(p\) 服从Beta分布 $ {\rm beta}(\alpha, \beta)$, 密度函数 \(\frac1{B(\alpha, \beta)} x^{\alpha- ...

  10. 虚拟机virtualBox

    在笔记本了装了一个虚拟机, 并安装了Linux系统, 方便测试linux 命令. 考虑到不需要图形界面, 学习了用命令行操作虚拟机, 配置如下 linux 下安装openssh-server 虚拟机设 ...