过滤器模式

一、什么是过滤器模式

  过滤器模式(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)的更多相关文章

  1. 设计模式系列之过滤器模式(Chriteria Pattern)

    过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这种类 ...

  2. 【设计模式 - 7】之过滤器模式(Filter)

    1      模式简介 过滤器模式(Filter)也叫标准模式(Criteria),这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来. 2      实例 需求 ...

  3. 基础设计模式-03 从过滤器(Filter)校验链学习职责链模式

    1.职责链路模式 1.1UML图 1.2 职责链路模式的概念 为了避免处理对象的耦合关系,将对象连成一个链,沿着这个链进行访问,直到有一个对象处理位置: 1.3 优点 1.按照一定的顺序执行判断: 2 ...

  4. 反馈法学习设计模式(一)——策略模式Strategy Pattern

    简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...

  5. 十五、过滤器(Filter)

    过滤器(Filter) 过滤器概述 1 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个Servlet时,会先执 ...

  6. Day21 过滤器(Filter)

    day21     过滤器(Filter) 过滤器概述   1 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个 ...

  7. 设计模式之过滤器模式(php实现)

    /** * github地址:https://github.com/ZQCard/design_pattern * 过滤器模式(Filter Pattern)或标准模式(Criteria Patter ...

  8. [07]Go设计模式:过滤器模式(FilterPattern)

    目录 过滤器模式 一.简介 二.代码 三.参考链接 过滤器模式 一.简介 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使 ...

  9. Java设计模-过滤器模式

    过滤器模式 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接 ...

随机推荐

  1. django 中 Oauth2 实现第三方登陆

    django 中 Oauth2 实现第三方登陆 python网站第三方登录,social-auth-app-django模块, social-auth-app-django模块是专门用于Django的 ...

  2. Git-遇到的问题以及解决方法

    1.将本地内容推送到远程仓库后,远程仓库里的文件夹不可点击 原因:在本地添加文件夹A时,又在A里使用了git init命令 解决:删除文件夹A,再重新添加过 2.其他人推送不了内容到远程仓库 原因:权 ...

  3. IOS渗透测试第一步-基础知识统一放送

    原文: http://www.websecgeeks.com/2017/04/ios-application-pentesting-part-3.html http://www.websecgeeks ...

  4. 微信小程序报Cannot read property 'setData' of undefined的错误

    最近在学习微信小程序的开发,让我吐槽的是,都9102年了,怎么还是有有时不能复制,有时不能打中文的bug呢,这个时候,你可以Ctrl+shift+w一下,如果还不行,那就得重启了.. 进入正题吧,刚在 ...

  5. Java swing皮肤(look and feel)大全

    ########## 优选 ########## Weblaf:非常赞的套件,界面现代.简约.依赖包较少. 有开源也有商业协议,个人最喜欢的皮肤.https://github.com/mgarin/w ...

  6. Quartz深入浅出(一)

    什么是Quartz Quartz是一个开源的作业调度框架,由java编写,在.NET平台为Quartz.Net,通过Quart可以快速完成任务调度的工作. Quartz能干什么/应用场景 如网页游戏中 ...

  7. Runtime 全方位装逼指南

    Runtime是什么?见名知意,其概念无非就是“因为 Objective-C 是一门动态语言,所以它需要一个运行时系统……这就是 Runtime 系统”云云.对博主这种菜鸟而言,Runtime 在实际 ...

  8. centos 7 Mysql5.7 主从复制配置

    1.环境 Centos 7 Mysql 5.7 Master  192.168.1.71 Slave01 192.168.1.72 2.分别配置master,slave01 # vi /etc/my. ...

  9. 静态编译 Qt5.7.0 (含 openssl 支持)

    关于Qt静态便宜的环境等,请先参见 Win10 + VS2015 下编译 Qt5.6.0 . 首先编译 openssl .我这里用的版本是 openssl 1.0.2j (新的1.1版本的便宜稍有不同 ...

  10. Postman入门之Mock测试

    1.什么是Mock测试: mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法. 2.添加要Mock测试的接口为example: 2.1点击r ...