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

目录

  • 目录
  • 过滤器模式
  • 实际案例
    • 定义
    • 测试
  • 实现方式
  • UML & Code
    • UML
    • Code
  • 系列导航

过滤器模式

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

实际案例

类信息概览:

类名 说明
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 filter(List personList) {
        List 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 filter(List 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 filter(List personList) {
        List 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;

/**
 * 

* *
 Created: 2018/5/14 下午7:53  
*
 Project: design-pattern  
* * @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 personList = Arrays.asList(one, two, three); List sexFilterResult = new PersonSexFilter().filter(personList); System.out.println(sexFilterResult); List 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 图示如下

Code

代码地址

过滤器模式

系列导航

系列导航

你可能感兴趣的:(design,pattern,Java,设计模式系列)