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

实现

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

创建一个Person类

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;

}

}

为标准创建一个接口

import java.util.List;

public interface Criteria {

public List meetCriteria(List persons);

}

创建实体类

创建CriteriaMale类

import java.util.ArrayList;

import java.util.List;

public class CriteriaMale implements Criteria {

@Override

public List meetCriteria(List persons) {

List malePersons = new ArrayList();

for (Person person : persons) {

if(person.getGender().equalsIgnoreCase("MALE")){

malePersons.add(person);

}

}

return malePersons;

}

}

创建CriteriaFemale类

import java.util.ArrayList;

import java.util.List;

public class CriteriaFemale implements Criteria {

@Override

public List meetCriteria(List persons) {

List femalePersons = new ArrayList();

for (Person person : persons) {

if(person.getGender().equalsIgnoreCase("FEMALE")){

femalePersons.add(person);

}

}

return femalePersons;

}

}

创建CriteriaSingle类

import java.util.ArrayList;

import java.util.List;

public class CriteriaSingle implements Criteria {

@Override

public List meetCriteria(List persons) {

List singlePersons = new ArrayList();

for (Person person : persons) {

if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){

singlePersons.add(person);

}

}

return singlePersons;

}

}

创建AndCriteria类

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 meetCriteria(List persons) {

List firstCriteriaPersons = criteria.meetCriteria(persons);

return otherCriteria.meetCriteria(firstCriteriaPersons);

}

}

创建OrCriteria类

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 meetCriteria(List persons) {

List firstCriteriaItems = criteria.meetCriteria(persons);

List otherCriteriaItems = otherCriteria.meetCriteria(persons);

for (Person person : otherCriteriaItems) {

if(!firstCriteriaItems.contains(person)){

firstCriteriaItems.add(person);

}

}

return firstCriteriaItems;

}

}

使用示例

import java.util.ArrayList;

import java.util.List;

public class CriteriaPatternDemo {

public static void main(String[] args) {

List persons = new ArrayList();

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 persons){

for (Person person : persons) {

System.out.println("Person : [ Name : " + person.getName()

+", Gender : " + person.getGender()

+", Marital Status : " + person.getMaritalStatus()

+" ]");

}

}

}

输出结果

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 ]

过滤器用到了java哪个模式_设计模式之过滤器模式——Java语言描述相关推荐

  1. 组合模式_[设计模式]10.组合模式

    组合模式,也叫"部分整体模式",它把相似的对象组合成树形结构的一个整体.于是,只需一个代表,我们就能继续访问与之相关的同族对象. 模式卡片 模式UML图 七个例子 部门里人很多,大 ...

  2. 抽象工厂模式_设计模式——抽象工厂模式

    阅读目录 使用频率:★★★★★ 一.什么是抽象工厂模式 二.补充说明 三.角色 四.例子 使用频率:★★★★★ 一.什么是抽象工厂模式 就是对一组具有相同主题的工厂进行封装(维基百科解释的很到位): ...

  3. java 肌汉模式_设计模式之原型模式详解(附源代码)

    原型模式(Prototype Pattern) 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  4. java 访问者模式_设计模式之访问者模式

    public interface Visitor { public void visitString(StringElement stringE); public void visitFloat(Fl ...

  5. python 享元模式_设计模式-创建型模式,python享元模式 、python单例模式(7)

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝 ...

  6. 米线店结账程序 装饰着模式_设计模式——装饰者模式

    <Head First 设计模式> 学习笔记,码云同步更新中 如有错误或不足之处,请一定指出,谢谢~ 目录 查看其它设计模式笔记,点这里→设计模式笔记汇总 装饰者模式 定义: 动态地将责任 ...

  7. Java进阶专题(七) 设计模式之委派模式与策略模式

    一.前言 今天开始我们专题的第七课了.本章节将介绍:你写的代码中是否觉得很臃肿,程序中有大量的if...else,想优化代码,精简程序逻辑,提升代码的可读性,这章节将介绍如何通过委派模式.策略模式让你 ...

  8. java 类爆炸_设计模式系列·类爆炸之 Bridge 模式

    迷之微笑 经过 C 哥的精心指导,消息中心终于上线!代码运行了半个月,稳健无 bug . 王小二托着下腮,看着代码,一抹迷之微笑随之闪现^_^.作为一名有追求的码农,此时的快乐或许只有自己能懂. 消息 ...

  9. java桥接和装饰_设计模式:桥接模式和装饰模式

    原标题:设计模式:桥接模式和装饰模式 一.桥接模式简介 1.基础描述 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是&qu ...

最新文章

  1. Go 分布式学习利器(19)-- Go并发编程 之 CSP(communicating sequential processes) 机制
  2. Redis进阶-Jedis以及Spring Boot操作 Redis 5.x Cluster
  3. SQL Server XML转Table
  4. 老板眼中理想的“数据中台”,是不是真的存在?
  5. axios重新调用失败的ajax_Vue之axios实现ajax数据请求
  6. 云原生是趋势吗?学习 K8s 和 Docker 的意义在哪里?
  7. hadoop中的序列化和反序列化
  8. 【java笔记】java基本语言风格(注释,数据,运算符)
  9. WSL下的Docker数据卷挂载
  10. 自增字段不连续_MySQL中自增主键不连续之解决方案。(20131109)
  11. 解决apicloud中真机同步海马玩模拟器中每次都要升级apploader的问题
  12. 十天学会单片机(4)数码管显示的原理,中断系统
  13. 用matlab计算矩阵的权重,如何使用matlab计算加权平均分
  14. vivos5字体怎么变大_vivos5手机参数
  15. Linux下ffmpeg批量转换图片
  16. 什么是智能颈部按摩仪低频脉冲电流?它会对人体有何影响?
  17. KylinV10上qt5.9开发应用打包步骤(四)--linuxdeployqt源码编译
  18. 全网最细最全OLAP之clickhouse笔记|clickhouse文档|clickhouse揭秘文档(三)--clickhouse单机安装和clickhouse集群安装
  19. AI开发者大会,李彦宏成“宏颜获水”?
  20. c语言生成随机数猜数字大小,产生一个随机数,进行猜数字小游戏

热门文章

  1. Hybris服务器启动日志分析
  2. 纯JavaScript实现的调用设备摄像头并拍照的功能
  3. SAP UI5 Nav container - how the inner control is added
  4. SAP UI5不支持delta render
  5. 使用dom breakpoint找到修改属性的javascript代码
  6. 阿里云的很多域名没有办法进行实名认证了吗
  7. CRM订单上状态字段在UI的显示逻辑
  8. SAP云平台webIDE UI5应用的Application Status菜单实现细节
  9. 如何使用SAP Gigya的登录服务和您的网站集成
  10. require php 5.3.0,PHP 5.3.0 安装分析心得