1、模式简介

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

2、实例

这个实例的需求如下:

  Person类有三个属性:姓名(Name)、性别(Gender)和婚姻情况(Marital),我们的系统中的一些功能需要对这些属性进行筛选,比如:

  • 得到所有的男性;
  • 得到所有的女性;
  • 得到所有还单身的人;
  • 得到所有已婚的人。

  系统还希望能够将这些条件组合起来进行筛选,比如:

  • 得到所有已婚男性;
  • 得到所有单身女性;
  • 得到所有已婚的人或女性;

分析:

  要解决这个问题,我们可以使用过滤器模式。

代码:

  Person类中的代码:

public class Person {
private String name; // 姓名
private String gender; // 性别
private String marital; // 婚姻情况 public Person(String name, String gender, String marital) {
this.name = name;
this.gender = gender;
this.marital = marital;
} 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 String getMarital() {
return marital;
} public void setMarital(String marital) {
this.marital = marital;
} @Override
public String toString() {
return "Person [name=" + name + ",gender=" + gender + ", marital=" + marital + "]";
}
}

  Filter接口中的代码:

public interface Filter {
// 根据传过来的Person列表,根据一定的条件过滤,得到目标集合
List<Person> filter(List<Person> persons);
}

  MaleFilter类中的代码:

public class MaleFilter implements Filter {

   @Override
public List<Person> filter(List<Person> persons) {
List<Person> result = new ArrayList<>();
for (Person person : persons) {
if ("MALE".equalsIgnoreCase(person.getGender())) {
result.add(person);
}
}
return result;
}
}

  处理“并且”逻辑的过滤器类FilterAnd类中的代码:

public class FilterAnd implements Filter {
private Filter filter;
private Filter otherFilter; public FilterAnd(Filter filter, Filter otherFilter) {
this.filter = filter;
this.otherFilter = otherFilter;
} @Override
public List<Person> filter(List<Person> persons) {
List<Person> tmpList = filter.filter(persons);
return otherFilter.filter(tmpList);
}
}

  处理“或者”逻辑的过滤器类FilterOr类中的代码:

public class FilterOr implements Filter {
private Filter filter;
private Filter otherFilter; public FilterOr(Filter filter, Filter otherFilter) {
this.filter = filter;
this.otherFilter = otherFilter;
} @Override
public List<Person> filter(List<Person> persons) {
List<Person> tmpList1 = filter.filter(persons);
List<Person> tmpList2 = otherFilter.filter(persons);
for (Person person : tmpList2) {
if (!tmpList1.contains(person)) {
tmpList1.add(person);
}
}
return tmpList1;
}
}

  测试类Test中的代码:

public class Test {
public static void main(String[] args) {
// 初始化数据
List<Person> persons = new ArrayList<>();
persons.add(new Person("霍一", "FEMALE", "MARRIED"));
persons.add(new Person("邓二", "MALE", "MARRIED"));
persons.add(new Person("张三", "MALE", "SINGLE"));
persons.add(new Person("李四", "FEMALE", "MARRIED"));
persons.add(new Person("王五", "MALE", "SINGLE"));
persons.add(new Person("赵六", "FEMALE", "SINGLE"));
persons.add(new Person("孙七", "MALE", "SINGLE"));
persons.add(new Person("罗八", "MALE", "MARRIED"));
persons.add(new Person("刘九", "FEMALE", "SINGLE"));
persons.add(new Person("史十", "FEMALE", "SINGLE"));
// 打印出所有男性的信息
System.out.println("---------------------所有男性---------------------");
List<Person> maleList = new MaleFilter().filter(persons);
printList(maleList);
// 打印出所有单身的信息
System.out.println("---------------------所有单身---------------------");
List<Person> singleList = new SingleFilter().filter(persons);
printList(singleList);
// 打印出所有已婚女性的信息
System.out.println("--------------------所有已婚女性-------------------");
List<Person> marriedFemaleList = new FilterAnd(new MarriedFilter(), new FemaleFilter()).filter(persons);
printList(marriedFemaleList);
// 打印出所有单身或女性的信息
System.out.println("-------------------所有单身或女性------------------");
List<Person> singleOrFemaleList = new FilterOr(new SingleFilter(), new FemaleFilter()).filter(persons);
printList(singleOrFemaleList);
} // 打印列表中的数据信息
private static void printList(List<Person> list) {
for (Person person : list) {
System.out.println(person.toString());
}
}
}

  测试代码如下图所示:

  最后贴出过滤器模式的GitHub代码:【GitHub - Filter】

【设计模式 - 7】之过滤器模式(Filter)的更多相关文章

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

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

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

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

  3. 设计模式のFilterPattern(过滤器模式)----结构模式

    一.产生背景 我们有一堆“人”的对象,我们应该怎么选择出其中的男性.女性或者其他类型的呢?这时候我们可以用过滤器模式 二.通常做法 我们将创建一个 Person 对象.Criteria 接口和实现了该 ...

  4. Java拦截过滤器模式

    当我们想要对应用程序的请求或响应进行一些预处理/后处理时,使用截取过滤器设计模式. 在将请求传递到实际目标应用程序之前,在请求上定义和应用过滤器. 过滤器可以进行请求的认证/授权/日志记录或跟踪,然后 ...

  5. 过滤器模式(Filter Pattern)

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

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

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

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

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

  8. Java设计模式应用——过滤器模式

    storm引擎计算出一批中间告警结果,会发送一条kafka消息给告警入库服务,告警入库服务接收到kafka消息后读取中间告警文件,经过一系列处理后把最终告警存入mysql中. 实际上,中间告警结果可能 ...

  9. 设计模式之过滤器模式——Java语言描述

    过滤器模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来 实现 创建一个Person对象.Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列 ...

随机推荐

  1. python模块学习 logging

    1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info messa ...

  2. ubuntu14.04 开启root登陆

    想要在登录界面使用root身份登录,可编辑/usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf文件, sudo gedit /usr/share/light ...

  3. TCPIP通信

    最近在开发TCPIP通信,封装了3个类,望各位大神指点指点. using System; using System.Collections.Generic; using System.Text; us ...

  4. jQuery获取Select选择的Text和 Value

    jQuery获取Select选择的Text和Value:语法解释:1. $("#select_id").change(function(){//code...});   //为Se ...

  5. React 学习资源分享 菜鸟刚学5天 博客写的不多 不懂写博客的套路

    http://www.ruanyifeng.com/blog/2015/03/react.html 首先个人强烈推荐 阮一峰的React基础 细细过一遍,看得出大师的用心良苦 然后就开始看书般的过ht ...

  6. iOS: 学习笔记, 用代码驱动自动布局实例

    iOS自动布局是设置iOS界面的利器. 本实例展示了如何使用自动布局语言设置水平布局, 垂直布局 1. 创建空白iOS项目 2. 添加一个控制器类, 修改YYAppDelegate.m文件 #impo ...

  7. 2016021904 - 如何使用Memory Analyzer

    如何使用Memory Analyzer呢? 0.有内存溢出的代码code.<深入理解java虚拟机>中代码 package neutron.oom.heap; import java.ut ...

  8. Noah的学习笔记之Python篇:函数“可变长参数”

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  9. bzoj 1079: [SCOI2008]着色方案 DP

    1079: [SCOI2008]着色方案 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 803  Solved: 512[Submit][Status ...

  10. [AHOI2015 Junior] [Vijos P1943] 上学路上 【容斥+组合数】

    题目链接:Vijos - P1943 题目分析 这是 AHOI 普及组的题目,然而我并不会做= =弱到不行= = 首先,从 (x, 0) 到 (0, y) 的最短路,一定是只能向左走和向上走,那么用组 ...