过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

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

简单的对象的创建

这里写了一些简单的额POJO对象,用于演示使用,主要就是Person和枚举类型.

  • @Data 是Lombok提供的插件支持,没有的话,可以手写setter/getter方法

Person

import lombok.Data;
import lombok.ToString;
import lombok.experimental.Accessors; @Data
@Accessors(chain = true)
@ToString
public class Person { private String name; private String gender; private int age; public Person(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
}

GenderStatus

性别状态信息

/**
* 作用:
*
* <p>时间:2018/6/26 22:08
*
* <p>位置:com.tao.example.design.criteria.entity
*
* @author Yan - tao - zhoutao825638@vip.qq.com
*/
public enum GenderStatus {
FEMALE,
MALE
}

过滤器的实现

过滤器接口


public interface Criteria {
/**
* 过滤器
*
* @param persons
* @return
*/
List<Person> meetCriteria(List<Person> persons);
}

基本过滤器

男性过滤器

public class CriteriaMale implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> collect =
persons
.stream()
.filter(
person -> {
return person.getGender().equals(GenderStatus.MALE.name());
})
.collect(Collectors.toList());
return collect;
}
}

女性过滤器

public class CriteriaFemale implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> collect =
persons
.stream()
.filter(
person -> {
return person.getGender().equals(GenderStatus.FEMALE.name());
})
.collect(Collectors.toList());
return collect;
}
}

成年过滤器

public class CriteriaAdult implements Criteria {

  @Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> personList =
persons.stream().filter(person -> person.getAge() >= 18).collect(Collectors.toList());
return personList;
}
}

逻辑过滤器组合

交集过滤器

提供两个基本过滤器,采用与操作线性过滤

public class AndCriteria implements Criteria {

  private Criteria mainCriteria;

  private Criteria otherCriteria;

  public AndCriteria(Criteria mainCriteria, Criteria otherCriteria) {
this.mainCriteria = mainCriteria;
this.otherCriteria = otherCriteria;
} @Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> mainCriteriaPersons = mainCriteria.meetCriteria(persons);
List<Person> personList = otherCriteria.meetCriteria(mainCriteriaPersons);
return personList;
}
}

并集过滤器

原理和交集过滤器类似

public class OrCriteria implements Criteria {

  private Criteria mainCriteria;

  private Criteria otherCriteria;

  public OrCriteria(Criteria mainCriteria, Criteria otherCriteria) {
this.mainCriteria = mainCriteria;
this.otherCriteria = otherCriteria;
} @Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> mainCriteriaPersons = mainCriteria.meetCriteria(persons);
List<Person> otherCriteriaPersons = otherCriteria.meetCriteria(persons);
mainCriteriaPersons.forEach(
person -> {
if (!otherCriteriaPersons.contains(mainCriteriaPersons)) {
otherCriteriaPersons.add(person);
}
});
return otherCriteriaPersons;
}
}

过滤效果测试

测试代码

使用如下代码测试

public class TestCriteriaPattern {
public static void main(String[] args) {
List<Person> persons = new ArrayList<Person>();
persons.add(new Person("赵清雅", GenderStatus.FEMALE.name(), 15));
persons.add(new Person("李建岺", GenderStatus.MALE.name(), 16));
persons.add(new Person("冯蕙茞", GenderStatus.FEMALE.name(), 17));
persons.add(new Person("周踵武", GenderStatus.MALE.name(), 18));
persons.add(new Person("杨畹兮", GenderStatus.FEMALE.name(), 15));
persons.add(new Person("姜驰骛", GenderStatus.MALE.name(), 21)); // 创建过滤器
CriteriaFemale criteriaFemale = new CriteriaFemale();
CriteriaMale criteriaMale = new CriteriaMale();
CriteriaAdult criteriaAdult = new CriteriaAdult(); AndCriteria maleAndAdult = new AndCriteria(criteriaMale, criteriaAdult);
AndCriteria femaleAndAdult = new AndCriteria(criteriaFemale, criteriaAdult); OrCriteria femaleOrAdult = new OrCriteria(criteriaFemale, criteriaAdult); printPersons("男性过滤器", criteriaMale.meetCriteria(persons));
printPersons("女性过滤器", criteriaFemale.meetCriteria(persons));
printPersons("成年过滤器", criteriaAdult.meetCriteria(persons));
printPersons("成年男性过滤器", maleAndAdult.meetCriteria(persons));
printPersons("成年女过滤器", femaleAndAdult.meetCriteria(persons));
printPersons("女性或成年过滤器", femaleOrAdult.meetCriteria(persons));
} public static void printPersons(String criteriaName, List<Person> personList) {
System.out.println(criteriaName);
if (personList.size() == 0){
System.out.println("\t 没有找到");
}
personList.forEach(
person -> {
System.out.println("\t" + person);
});
System.out.println("---------------------");
}
}

测试输出

男性过滤器
Person(name=李建岺, gender=MALE, age=16)
Person(name=周踵武, gender=MALE, age=18)
Person(name=姜驰骛, gender=MALE, age=21)
---------------------
女性过滤器
Person(name=赵清雅, gender=FEMALE, age=15)
Person(name=冯蕙茞, gender=FEMALE, age=17)
Person(name=杨畹兮, gender=FEMALE, age=15)
---------------------
成年过滤器
Person(name=周踵武, gender=MALE, age=18)
Person(name=姜驰骛, gender=MALE, age=21)
---------------------
成年男性过滤器
Person(name=周踵武, gender=MALE, age=18)
Person(name=姜驰骛, gender=MALE, age=21)
---------------------
成年女过滤器
没有找到
---------------------
女性或成年过滤器
Person(name=周踵武, gender=MALE, age=18)
Person(name=姜驰骛, gender=MALE, age=21)
Person(name=赵清雅, gender=FEMALE, age=15)
Person(name=冯蕙茞, gender=FEMALE, age=17)
Person(name=杨畹兮, gender=FEMALE, age=15)
---------------------

设计模式系列之过滤器模式(Chriteria Pattern)的更多相关文章

  1. 设计模式系列之迭代器模式(Iterator Pattern)——遍历聚合对象中的元素

    模式概述 模式定义 模式结构图 模式伪代码 模式改进 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修 ...

  2. 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  3. 设计模式系列之组合模式(Composite Pattern)——树形结构的处理

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  4. 设计模式系列之外观模式(Facade Pattern)——提供统一的入口

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  5. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  6. 设计模式系列之原型模式(Prototype Pattern)——对象的克隆

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  7. 设计模式系列之策略模式(Strategy Pattern)

    意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:一个系统有许多许多类,而区分它 ...

  8. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  9. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

随机推荐

  1. android自动化必备之SDK

    进入到SDK包中,通过打开SDK manager.exe即可看到SDK管理界面,可能部分童靴发现一直在加载出不来,我们需要设置代理来解决: 选择工具栏上的Tools->Options打开如下窗口 ...

  2. Spring Cloud Greenwich 正式发布,Hystrix 即将寿终正寝。。

    Spring Cloud Greenwich 正式版在 01/23/2019 这天正式发布了,下面我们来看下有哪些更新内容. 生命周期终止提醒 Spring Cloud Edgware Edgware ...

  3. Python实现 Typora数学公式 转 有道云笔记Markdown数学公式

    话不多说上代码,可以按照自己的需求把匿名函数改成普通函数,改不来的可以加我微信我帮你改. 块状数学公式转换 import re test_str = r''' $D={\{\vec{x_1},\vec ...

  4. ORA-01034: ORACLE not available问题

    通过DBCA新建一个数据库后,执行以下命令报错:SQL> shutdown immediate;ERROR:ORA-01034: ORACLE not availableORA-27101: s ...

  5. Eureka介绍

    1.  Eureka是什么 Eureka是一个基于REST的服务,主要用于AWS云中的定位服务,以实现中间层服务器的负载平衡和故障转移 在 Spring Cloud 微服务架构中通常用作注册中心 我们 ...

  6. Ocelot监控

    网关的作用之一,就是有统一的数据出入口,基于这个功能,我们可以在网关上配置监控,从而把所有web服务的请求应答基本数据捕获并展显出来.关于web的监控,一般的做法是采集数据并保存,然后通过图表的方式展 ...

  7. redis 系列14 有序集合对象

    一. 有序集合概述 Redis 有序集合对象和集合对象一样也是string类型元素的集合,且不允许重复的成员.不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员 ...

  8. Net Configuration Agent

    提出Configuration Agent这样一个东西可能会让人感到奇怪,对于配置信息读取什么还需要一个Agent;那Agent的作用是什么,能达到一个怎样的目的,下面讲解为何需要Agent和其重要性 ...

  9. IntelliJ IDEA上操作GitHub

    IntelliJ IDEA集成了对GitHub的支持,使上传代码到GitHub和从GitHub下载代码更加方便快捷. 一. 分享代码到GitHub 1.首先需要在IntelliJ配置Git,如果没有正 ...

  10. leetcode — palindrome-partitioning-ii

    import java.util.Arrays; /** * * Source : https://oj.leetcode.com/problems/palindrome-partitioning-i ...