过滤器模式(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. Java web每天学之Servlet工作原理详情解析

    上篇文章中我们介绍了Servlet的实现方式以及Servlet的生命周期,我们这篇文章就来介绍一下常用对象. 点击回顾:<Java Web每天学之Servlet的工作原理解析>:<J ...

  2. Web前端-JavaScript基础教程上

    Web前端-JavaScript基础教程 将放入菜单栏中,便于阅读! JavaScript是web前端开发的编程语言,大多数网站都使用到了JavaScript,所以我们要进行学习,JavaScript ...

  3. [Swift]LeetCode753. 破解保险箱 | Cracking the Safe

    There is a box protected by a password. The password is n digits, where each letter can be one of th ...

  4. [Swift]LeetCode783. 二叉搜索树结点最小距离 | Minimum Distance Between BST Nodes

    Given a Binary Search Tree (BST) with the root node root, return the minimum difference between the ...

  5. Hive篇--相关概念整理一

    一.前述 hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 其优点是学习成本低 ...

  6. SH2018笔试题之成长值问题

    一.题目 详见代码 二.代码 import java.util.Scanner; /** * 3 * 1 1 5 10 * 2 3 4 * 1 4 6 -5 */ public class main4 ...

  7. BBS论坛(十六)

    16.登录功能完成 (1)front/forms.py class SigninForm(BaseForm): telephone = StringField(validators=[Regexp(r ...

  8. JVM基础系列第15讲:JDK性能监控命令

    查看虚拟机进程:jps 命令 jps 命令可以列出所有的 Java 进程.如果 jps 不加任何参数,可以列出 Java 程序的进程 ID 以及 Main 函数短名称,如下所示. $ jps 6540 ...

  9. 【JMeter】(3)---MySQL压测

    JMeter---MySQL压测 一.添加MySQL驱动jar包 在测试计划(Test Plan)页面添加jar包 二.添加MySQL连接配置 添加线程组右击-->添加(add)-->配置 ...

  10. mac用户丢失管理员身份急救

    用了这么久mac,发现居然还存在这么大一个bug.就是如果你曾经编辑mac电脑默认用户资料,比如试图改用户名.试图改HOME路径之类的,有很高比率可能导致该用户丧失管理员权限. 随后悲剧就开始了,所有 ...