过滤器模式(Filter Pattern)
过滤器模式
一、什么是过滤器模式
过滤器模式(Filter Pattern),这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
二、具体实现
1、主要角色
过滤对象:需要过滤的对象。
过滤条件接口:抽象过滤条件的接口。
具体的过滤条件:根据需要实现过滤条件接口的具体过滤条件。
2、代码实现
1、需要过滤的对象
package com.designpattern.filterPattern;
/**
* 过滤的对象
*
* @author zhongtao on 2018/12/12
*/
public class Person {
private String name;
private String gender; //性别
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
public Person() {
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
'}';
}
}
2、过滤条件接口
package com.designpattern.filterPattern;
import java.util.List;
/**
* 过滤条件接口
*
* @author zhongtao on 2018/12/12
*/
public interface FilterCriteria {
List<Person> filterCriteria(List<Person> persons);
}
3、具体过滤条件 实现过滤条件接口
package com.designpattern.filterPattern;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 过滤男性
*
* @author zhongtao on 2018/12/12
*/
public class MaleFilter implements FilterCriteria {
@Override
public List<Person> filterCriteria(List<Person> persons) {
//通过流来处理
return persons.stream().filter(person -> Objects.equals(person.getGender(), "MALE")).collect(Collectors.toList());
}
}
package com.designpattern.filterPattern;
import java.util.List;
import java.util.stream.Collectors;
/**
* 年龄大于20
*
* @author zhongtao on 2018/12/12
*/
public class AgeGreaterThan20Filter implements FilterCriteria {
@Override
public List<Person> filterCriteria(List<Person> persons) {
return persons.stream().filter(person -> person.getAge() > 20).collect(Collectors.toList());
}
}
package com.designpattern.filterPattern;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 过滤男性并且年龄大于20
*
* @author zhongtao on 2018/12/12
*/
public class MaleAndAgeGreaterThan20Filter implements FilterCriteria {
@Override
public List<Person> filterCriteria(List<Person> persons) {
return persons.stream().filter(person -> Objects.equals(person.getGender(), "MALE"))
.filter(person -> person.getAge() > 20)
.collect(Collectors.toList());
}
}
4、测试过滤器模式
package com.designpattern.filterPattern;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhongtao on 2018/12/12
*/
public class FilterPatternTest {
/**
* 测试过滤器模式
*/
@Test
public void testFilterPattern() {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Peter", "MALE", 24));
persons.add(new Person("Mary", "FEMALE", 22));
persons.add(new Person("Bob", "MALE", 18));
persons.add(new Person("Lina", "FEMALE", 20));
persons.add(new Person("Luna", "FEMALE", 21));
FilterCriteria maleFilter = new MaleFilter();
List<Person> males = maleFilter.filterCriteria(persons);
System.out.println("男的:" + males);
FilterCriteria ageGreaterThan20 = new AgeGreaterThan20Filter();
List<Person> ageThan20 = ageGreaterThan20.filterCriteria(persons);
System.out.println("年龄大于20的人:" + ageThan20);
FilterCriteria maleAndAgeGreaterThan20 = new MaleAndAgeGreaterThan20Filter();
List<Person> personList = maleAndAgeGreaterThan20.filterCriteria(persons);
System.out.println("男的且年龄大于20的人:" + personList);
}
}
5、测试结果
男的:[Person{name='Peter', gender='MALE', age=24}, Person{name='Bob', gender='MALE', age=18}]
年龄大于20的人:[Person{name='Peter', gender='MALE', age=24}, Person{name='Mary', gender='FEMALE', age=22}, Person{name='Luna', gender='FEMALE', age=21}]
男的且年龄大于20的人:[Person{name='Peter', gender='MALE', age=24}]
源码地址:https://github.com/zt19994/designPattern
过滤器模式(Filter Pattern)的更多相关文章
- 设计模式系列之过滤器模式(Chriteria Pattern)
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这种类 ...
- 【设计模式 - 7】之过滤器模式(Filter)
1 模式简介 过滤器模式(Filter)也叫标准模式(Criteria),这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来. 2 实例 需求 ...
- 基础设计模式-03 从过滤器(Filter)校验链学习职责链模式
1.职责链路模式 1.1UML图 1.2 职责链路模式的概念 为了避免处理对象的耦合关系,将对象连成一个链,沿着这个链进行访问,直到有一个对象处理位置: 1.3 优点 1.按照一定的顺序执行判断: 2 ...
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- 十五、过滤器(Filter)
过滤器(Filter) 过滤器概述 1 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个Servlet时,会先执 ...
- Day21 过滤器(Filter)
day21 过滤器(Filter) 过滤器概述 1 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个 ...
- 设计模式之过滤器模式(php实现)
/** * github地址:https://github.com/ZQCard/design_pattern * 过滤器模式(Filter Pattern)或标准模式(Criteria Patter ...
- [07]Go设计模式:过滤器模式(FilterPattern)
目录 过滤器模式 一.简介 二.代码 三.参考链接 过滤器模式 一.简介 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使 ...
- Java设计模-过滤器模式
过滤器模式 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接 ...
随机推荐
- 简谈Entity Framework的优缺点
Entity Framework简介 Entity Framework的全称为 ADO.NET Entity Framework ,简称为EF, 是微软以ADO.NET为基础发展出来的实体框架,早期被 ...
- [leetcode.com]算法题目 - Pow(x, n)
Implement pow(x, n). class Solution { public: double pow(double x, int n) { // Start typing your C/C ...
- #loj3090 [BJOI2019] 勘破神机
简单线性代数练习题 首先翻开具体数学生成函数一章,可以发现\(F(n),G(n)\)满足以下递推式 \[F(n)=F(n-1)+F(n-2),F(0)=1,F(1)=1\] \[G(n)=4G(n-2 ...
- Android-----application的学习
一.Application的对象回调函数 1.onCreate : Application对象被创建时候会调用 2.onConfigurationChanged : 屏幕方向变化.系统语言的更改等 3 ...
- 在window主机上访问virtualbox虚拟机上centos7的tomcat服务
在virtualbox上装完centos7后,随后装了tomcat服务器,然后在主机上发现用google浏览器访问tomcat不了 于是用ping检测下,发现ping不通,经过多方查找,才配置好,于是 ...
- Spring Boot中使用JdbcTemplate访问数据库
本文介绍在Spring Boot基础下配置数据源和通过JdbcTemplate编写数据访问的示例. 数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式. ...
- grub 引导修复
- jquery中的ajax请求,阻塞ui线程的解决方案(自己总结的demo)
/*****************************************************/ function getAjaxData(url,data){ showLoading( ...
- oracle 切换用户操作--or--sys用户密码忘记
1.sqlplus中以普通用户登录oracle后, 普通用户的登录方式: sqlplus /nolog conn 用户名/密码@IP地址/orcl:1521; 这个时候,想要切换sys用户,conn ...
- 平衡二叉树-AVL树(LL、RR、LR、RL旋转)
平衡二叉树的定义: 任意的左右子树高度差的绝对值不超过1,将这样的二叉树称为平衡二叉树,二叉平衡树前提是一个二叉排序树. 平衡二叉树的插入: 二叉平衡树在插入或删除一个结点时,先检查该操作是否导致了树 ...