过滤器模式

过滤器模式(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. Linq------连表查询

    1 List<Student> list = new List<Student>() { ,sex="男"}, ,sex="男"}, , ...

  2. nginx 负载策略

    1.轮询(weight=1) 默认选项,当weight不指定时,各服务器weight相同,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. upstream bak ...

  3. STM32重映射

  4. zip4j 2.0压缩 加密压缩

    https://github.com/srikanth-lingala/zip4j ZipParameters zipParameters = new ZipParameters(); zipPara ...

  5. java数据库连接池比较

    dbcp dbcp可能是使用最多的开源连接池,原因大概是因为配置方便,而且很多开源和tomcat应用例子都是使用的这个连接池吧.这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有.这个连接 ...

  6. ae基础一

    1.导入素材2.整理素材3.创建合成1280*720是高清的模式 也是平时都用的格式 HDV/HDTV 720 251920*1080是超清的模式格式是以16:9的格式显示的 电脑电视机都是用这个比例 ...

  7. tensorflow deeplabv3 训练自己的数据集

    https://blog.csdn.net/malvas/article/details/90776327

  8. caffe不同lr_policy参数设置方法

    fixed 参数: base_lr: 0.01 lr_policy: "fixed" max_iter: 400000 step 参数: base_lr: 0.01 lr_poli ...

  9. POJ 1734 Sightseeing trip(Floyd)

    题目传送门 题目中文翻译: Description 桑给巴尔岛上的阿德尔顿镇有一家旅行社,它已决定为其客户提供除了许多其他名胜之外的景点.为了尽可能地从景点赚取收入,该机构已经接受了一个精明的决定:有 ...

  10. numpy 加速 以及 ipython

    先安装openblas, 然后用pip 安装numpy sudo ln -s /usr/lib64/libopenblas-r0.2.14.so /usr/lib64/libopenblas.so 为 ...