当前位置: 首页 > news >正文

08-Java过滤器模式 ( Filter Pattern )

Java过滤器模式

    • 实现
    • 范例

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

  • 过滤器模式(Filter Pattern) 又称 标准模式(Criteria Pattern)

过滤器模式属于结构型模式,它结合多个标准来获得单一标准

实现

过滤器模式

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

范例

1. 创建一个类,在该类上应用标准.

Person.java

package com.demo.gof;
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

package com.demo.gof;
import java.util.List;public interface Criteria {public List<Person> meetCriteria(List<Person> persons);
}

3. 创建实现了 Criteria 接口的实体类

CriteriaMale.java

package com.demo.gof;
import java.util.ArrayList;
import java.util.List;public class CriteriaMale implements Criteria {@Overridepublic 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

package com.demo.gof;
import java.util.ArrayList;
import java.util.List;public class CriteriaFemale implements Criteria {@Overridepublic 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

package com.demo.gof;
import java.util.ArrayList;
import java.util.List;public class CriteriaSingle implements Criteria {@Overridepublic 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

package com.demo.gof;
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; }@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);       return otherCriteria.meetCriteria(firstCriteriaPersons);}

OrCriteria.java

package com.demo.gof;
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; }@Overridepublic 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

package com.demo.gof;
import java.util.ArrayList; 
import java.util.List;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()+" ]");}}      
}

编译运行以上 Java 范例,输出结果如下

$ javac -d . src/main/com.demo/gof/CriteriaPatternDemo.java
$ java  com.demo.gof.CriteriaPatternDemo
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 ]

相关文章:

  • QT设置qss
  • 11 插入排序和希尔排序
  • 《Docker极简教程》--Docker环境的搭建--在Mac上搭建Docker环境
  • C语言使⽤ scanf()函数应注意的问题是什么?
  • 设计模式(结构型模式)桥接模式
  • linux的tree用法
  • 【每日一题】LeetCode——反转链表
  • HCIA-HarmonyOS设备开发认证V2.0-3.轻量系统内核基础
  • vue绘制语音波形图---wavesurfer.js
  • FPS游戏框架漫谈第二十二天
  • 【go】ent操作之CRUD与联表查询
  • uniapp /微信小程序 使用map组件实现手绘地图方案
  • office文件转pdf在线预览
  • 【前端高频面试题--Vue基础篇】
  • 多模态对比语言图像预训练CLIP:打破语言与视觉的界限,具备零样本能力
  • 《剑指offer》分解让复杂问题更简单
  • Android单元测试 - 几个重要问题
  • ES6 ...操作符
  • java正则表式的使用
  • js如何打印object对象
  • JWT究竟是什么呢?
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python socket服务器端、客户端传送信息
  • Redash本地开发环境搭建
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 从零开始的无人驾驶 1
  • 给Prometheus造假数据的方法
  • 机器学习学习笔记一
  • 前端之React实战:创建跨平台的项目架构
  • 用jQuery怎么做到前后端分离
  • ​比特币大跌的 2 个原因
  • #Java第九次作业--输入输出流和文件操作
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #预处理和函数的对比以及条件编译
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (层次遍历)104. 二叉树的最大深度
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (十一)图像的罗伯特梯度锐化
  • (四)Controller接口控制器详解(三)
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)关于多人操作数据的处理策略
  • .CSS-hover 的解释
  • .NET 8.0 中有哪些新的变化?
  • .NET Core中的去虚
  • .Net的DataSet直接与SQL2005交互
  • .NET序列化 serializable,反序列化
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @angular/cli项目构建--Dynamic.Form
  • @JSONField或@JsonProperty注解使用