过滤器模式

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

这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

实际案例

类信息概览:

类名 说明
Main.java 方法的总入口
Person.java
PersonSexFilter.java 性别过滤器
PersonFilter.java 过滤器接口
PersonAgeFilter.java 年龄过滤器

定义

  • Person.java
  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.ryo.design.pattern.note.filter; import lombok.Builder; import lombok.Data; /** * 人 * @author bbhou * @date 2017/8/11 */ @Data @Builder public class Person { /** * 性别 */ private String sex; /** * 年龄 */ private int age; }
  • PersonSexFilter.java
  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.ryo.design.pattern.note.filter; import java.util.LinkedList; import java.util.List; /** * 人类性别过滤器 * @author bbhou * @date 2017/8/11 */ public class PersonSexFilter implements PersonFilter { /** * 这种写法非常之麻烦。 * 1. 使用 guva 或者 linq 要简洁 许多 * @param personList 等待过滤的列表 * @return */ @Override public List<Person> filter(List<Person> personList) { List<Person> boyList = new LinkedList<>(); for(Person person : personList) { if("boy".equals(person.getSex())) { boyList.add(person); } } return boyList; } }
  • PersonFilter.java
  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.ryo.design.pattern.note.filter; import java.util.List; /** * 人类过滤器 * @author bbhou * @date 2017/8/11 */ public interface PersonFilter { /** * 对列表进行过滤 * @param personList 等待过滤的列表 * @return 已经过滤的列表结果 */ List<Person> filter(List<Person> personList); }
  • PersonAgeFilter.java
  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.ryo.design.pattern.note.filter; import java.util.LinkedList; import java.util.List; /** * 人年龄过滤器 * @author bbhou * @date 2017/8/11 */ public class PersonAgeFilter implements PersonFilter { @Override public List<Person> filter(List<Person> personList) { List<Person> youngList = new LinkedList<>(); for(Person person : personList) { int age = person.getAge(); if(age > 0 && age <= 20) { youngList.add(person); } } return youngList; } }

测试

  • Main.java
  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * Copyright (c) 2012-2018. houbinbini Inc. * design-pattern All rights reserved. */ package com.ryo.design.pattern.note.filter; import java.util.Arrays; import java.util.List; /** * <p> </p> * * <pre> Created: 2018/5/14 下午7:53 </pre> * <pre> Project: design-pattern </pre> * * @author houbinbin * @version 1.0 * @since JDK 1.7 */ public class Main { public static void main(String[] args) { Person one = Person.builder().age(20).sex("boy").build(); Person two = Person.builder().age(20).sex("girl").build(); Person three = Person.builder().age(25).sex("boy").build(); List<Person> personList = Arrays.asList(one, two, three); List<Person> sexFilterResult = new PersonSexFilter().filter(personList); System.out.println(sexFilterResult); List<Person> ageFilterResult = new PersonAgeFilter().filter(personList); System.out.println(ageFilterResult); } }
  • 测试结果
  [plaintext]
1
2
[Person(sex=boy, age=20), Person(sex=boy, age=25)] [Person(sex=boy, age=20), Person(sex=girl, age=20)]

实现方式

UML & Code

UML

UML 图示如下

Code

代码地址

过滤器模式

系列导航

系列导航