过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式容许开发人员使用不一样的标准来过滤一组对象,
经过逻辑运算以解耦的方式把它们链接起来。这种类型的设计模式属于结构型模式,它结合多个标准来得到单一标准。java
类信息概览:git
类名 | 说明 |
---|---|
Main.java | 方法的总入口 |
Person.java | 人 |
PersonSexFilter.java | 性别过滤器 |
PersonFilter.java | 过滤器接口 |
PersonAgeFilter.java | 年龄过滤器 |
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;
}
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;
}
}
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);
}
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;
}
}
/* * 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);
}
}
[Person(sex=boy, age=20), Person(sex=boy, age=25)]
[Person(sex=boy, age=20), Person(sex=girl, age=20)]
UML 图示以下github
代码地址web
过滤器模式json
系列导航设计模式