设计模式系列之过滤器模式(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 ...
随机推荐
- flex弹性布局心得
概述 最近做项目用flex重构了一下网页中的布局,顺便学习了一下flex弹性布局,感觉超级强大,有一些心得,记录下来供以后开发时参考,相信对其他人也有用. 参考资料: Solved by Flexbo ...
- [Swift]LeetCode289. 生命游戏 | Game of Life
According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a cellul ...
- [Swift]LeetCode639. 解码方法 2 | Decode Ways II
A message containing letters from A-Z is being encoded to numbers using the following mapping way: ' ...
- [Swift]LeetCode965. 单值二叉树 | Univalued Binary Tree
A binary tree is univalued if every node in the tree has the same value. Return true if and only if ...
- 记录一次安装OpenGL的漫长过程
尝试codeblock和Dev-C++ 这学期新开了一门计算机图形图像的课,里面涉及到openGL,中午跑到图书馆开始倒腾OpenGL. 因为电脑里本来有codeblock,于是就想不用教材里面所说的 ...
- http初探
http超文本传输协议 一.版本差异: 版本分0.9 1.0 1.1 2.0 http0.9/1.0已经过时:目前主要是1.1版本的,2.0版本的还没普及. http1.1 ----在同 ...
- MySQL优化之推荐使用规范
一.基础规范 使用InnoDB存储引擎支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 推荐使用utf8mb4字符集无需转码,无乱码风险, 支持emoji表情以及部分不常见汉字 ...
- 1.MySQL(一)
数据库简介 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库 RDBMS 即关系数据库管理系统(Relational Database Management System) 1.特 ...
- RTMP、HTTP-FLV、HLS,你了解常见的三大直播协议吗
随着直播行业大火,游戏.乐秀.教育.发布会等直播类产品层出不穷,能够满足各方人员的需求.在直播中,总能在其中找到适合自己的产品内容.喜欢玩游戏的可以看游戏直播,想学点工作技能的,也可以观看大牛现场授课 ...
- C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法【转】
前言 C# 用IP地址(123.125.114.144)查询位置(北京市百度公司)的东西,非常好用也非常方便,可手动升级刷新IP库,一次编码永久收益,可支持winform.asp.net等程序. 本文 ...