设计模式系列之过滤器模式(Chriteria Pattern)
过滤器模式(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)的更多相关文章
- 设计模式系列之迭代器模式(Iterator Pattern)——遍历聚合对象中的元素
模式概述 模式定义 模式结构图 模式伪代码 模式改进 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修 ...
- 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 设计模式系列之组合模式(Composite Pattern)——树形结构的处理
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 设计模式系列之外观模式(Facade Pattern)——提供统一的入口
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 设计模式系列之原型模式(Prototype Pattern)——对象的克隆
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 设计模式系列之策略模式(Strategy Pattern)
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:一个系统有许多许多类,而区分它 ...
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...
随机推荐
- 关于CGI 和 PHP-FPM需要弄清的
https://blog.csdn.net/gao_yu_long/article/details/79390510 补充一点: 如果php-cgi -b 127.0.0.1:6999,则6999端口 ...
- 心路历程(一)-自学java两个月心得
这是我的第一条博文,在敲这些文字的时候我已经是一名大四的"老者".说自己"老者"确实如此,因为以前每当这个时候大一新学妹有上架了,哈哈,每当这个时候我们就想了很 ...
- 启动MongoDB shell客户端会什么会一闪而过
解决办法: 在MongoDB shell客户端根目录下右击选择 "在此处打开命令窗口"; 在命令窗口敲入mongod --dbpath=d:/mongodb/data ; //我的 ...
- 【JMeter】(3)---MySQL压测
JMeter---MySQL压测 一.添加MySQL驱动jar包 在测试计划(Test Plan)页面添加jar包 二.添加MySQL连接配置 添加线程组右击-->添加(add)-->配置 ...
- 『Kruscal重构树 Exkruscal』
新增一道例题及讲解 Exkruscal \(Exkruscal\)又称\(Kruscal\)重构树,是一种利用经典算法\(Kruscal\)来实现的构造算法,可以将一张无向图重构为一棵具有\(2n-1 ...
- 道路运输车辆卫星定位系统JT/T808服务实现和压测
在工作上的需要接触道路运输车辆卫星定位系统相关应用,由于自己对网络服务的编写比较感兴趣,所以利用空闲时间实现了JT/T808的一些协议和相关服务(不得不说这种协议的设计在解释的确导致性能上的损耗,特别 ...
- 用Javascript方式实现LeetCode中的算法(更新中)
前一段时间抽空去参加面试,面试官一开始让我做一道题,他看完之后,让我回答一下这个题的时间复杂度并优化一下,当时的我虽然明白什么是时间复杂度,但不知道是怎么计算的,一开局出师不利,然后没然后了,有一次我 ...
- centos系统安装第三方源EPEL
epel没安装呗 相当于扩展型软件仓库,EPEL (Extra Packages for Enterprise Linux,企业版Linux的额外软件包) 是Fedora小组维护的一个软件仓库项目,为 ...
- AppBoxFuture(六): 前端组件化开发
前面几篇都是在介绍结构化与非结构化的数据存储,本篇换换口味介绍一下框架是如何实现前端组件化开发的.首先得感谢Vue.ElementUI等优秀的前端开源项目,这些项目帮助作者快速实现了框架的两个前端 ...
- Spring Boot 2.x(十四):整合Redis,看这一篇就够了
目录 Redis简介 Redis的部署 在Spring Boot中的使用 Redis缓存实战 寻找组织 程序员经典必备枕头书免费送 Redis简介 Redis 是一个开源的使用 ANSI C 语言编写 ...