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. 异步调用backgroudworker

    先看一个小例子:C#客户端打开一个控件,控件中加载了好多数据大约要用5秒中,如果我们直接打开控件,那么这个控件就要5秒中才能弹出来,当然这个时候用户已经把他Kill了.这个时候我们就需要先给用户把控件 ...

  2. Gvim7.4简单配置

    今天下午小折腾了一会Gvim编辑器(7.4版,目前最新).看起来高端又没有代码提示,还能锻炼锻炼记忆. 修改了下默认启动配置<修改后如下图>: 打开编辑器: 编辑->启动设定-> ...

  3. 关于微软RDLC报表打印时文字拉伸问题(Windows server 2003 sp2)

    最近我们开发的打印服务频频出现打印文字拉伸问题,客户意见络绎不绝,最为明显的是使用黑体加粗后 “2.0份” 打印出来后小数点几乎看不见了,用户很容易误认为 “ 20份” .所以问题达到了不得不停下手上 ...

  4. servlet跳转jsp

    ackage com.monkey.servlet; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; im ...

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

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

  6. Javascript异步编程的4种方法(转载)

    原博地址: http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html

  7. ebook-nodej

    http://www.nodebeginner.org/index-zh-cn.html https://about.pinterest.com/careers/engineering/#oFwkXf ...

  8. 【HDOJ】4612 Warm up

    双连通缩点+求树的直径,图论基础题目. /* 4612 */ #pragma comment(linker, "/STACK:1024000000,1024000000") #in ...

  9. 【HDOJ】4587 TWO NODES

    Tarjan解无向图的割点和桥,参考白书. /* 4587 */ #include <iostream> #include <vector> #include <algo ...

  10. bzoj1236

    其实这道题目不难,主要要求我们有一个清晰地思路首先可以按位数讨论,这里我把1~9单独讨论了因为除了1位数,每个位数开头的数的开头数字1前面都是-号然后考虑位数的奇偶性当位数为奇数的时候比较简单举个例子 ...