java 23 种设计模式-08-java 过滤器模式(Filter Pattern)

目录

过滤器模式

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式容许开发人员使用不一样的标准来过滤一组对象,
经过逻辑运算以解耦的方式把它们链接起来。这种类型的设计模式属于结构型模式,它结合多个标准来得到单一标准。java

实际案例

类信息概览:git

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

定义

  • Person.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;

}
  • PersonSexFilter.java
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
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
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
/* * 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 & Code

UML

UML 图示以下github

Code

代码地址web

过滤器模式json

系列导航

系列导航设计模式