09 过滤器模式

过滤器模式

用来过滤数据,通过一个或多个定义过滤规则,窜起来过滤原始数据。

demo

java 复制代码
package structuralpattern;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author tx
 * @version 1.0
 * @date 2024/1/8 9:00
 * @description:
 * 过滤器模式
 * 用以筛选数据
 */
public class FilterPattern {
    /**
     * 打印list,方便展示
     */
    public static <T> void printList(List<T> list){
        System.out.println("[");
        for (T one : list) {
            System.out.println(one.toString());
        }
        System.out.println("]");
    }
    public static void main(String[] args) {
        // 过滤器创建
        Filter filter1 = new Filter1();
        Filter filter2 = new Filter2();
        Filter3 filter3 = new Filter3();
        // 构造假数据
        List<Product> products = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            products.add(new Product("张"+i, (int) Math.round(Math.random()*20)));
            products.add(new Product("李"+i, (int) Math.round(Math.random()*20)));
        }
        // 原始数据打印
        System.out.println("原始数据");
        FilterPattern.printList(products);
        // 使用单一过滤器,size 大于5的
        System.out.println("使用单一过滤器,size 大于5的:");
        List<Product> ans1 = filter1.filter(products);
        FilterPattern.printList(ans1);
        // 使用单一过滤器,姓名包含张的
        System.out.println("使用单一过滤器,姓名包含张的:");
        List<Product> ans2 = filter3.filter(products);
        FilterPattern.printList(ans2);
        // 使用组合过滤器,组合上面三种条件
        System.out.println("使用组合过滤器,组合上面三种条件:");
        ArrayList<Filter> filtersArgs = new ArrayList<>();
        filtersArgs.add(filter1);
        filtersArgs.add(filter2);
        filtersArgs.add(filter3);
        Filter filters = new Filters(filtersArgs);
        List<Product> ans3 = filters.filter(products);
        FilterPattern.printList(ans3);

    }
}

/**
 * 组合过滤器
 */
class Filters implements Filter{
    private final List<Filter> filters;
    public Filters(List<Filter> filters) {
        this.filters = filters;
    }
    @Override
    public List<Product> filter(List<Product> products) {
        List<Product> local = products;
        for (Filter filter : filters) {
            local = filter.filter(local);
        }
        return local;
    }
}


/**
 * 过滤器的接口
 */
interface Filter{
    List<Product> filter(List<Product> products);
}
/**
 * 过滤大小大于5的
 */
class Filter1 implements Filter{
    @Override
    public List<Product> filter(List<Product> products) {
        return products.stream()
                .filter(p -> p.size() > 5)
                .collect(Collectors.toList());
    }
}
/**
 * 过滤大小小于15的
 */
class Filter2 implements Filter{
    @Override
    public List<Product> filter(List<Product> products) {
        return products.stream()
                .filter(p -> p.size() <15)
                .collect(Collectors.toList());
    }
}
/**
 * 过滤名字含有 张 的
 */
class Filter3 implements Filter{
    @Override
    public List<Product> filter(List<Product> products) {
        return products.stream()
                .filter(p -> p.name().contains("张"))
                .collect(Collectors.toList());
    }
}

/**
 * 需要被过滤的对象
 */
class Product{
    private String name;
    private Integer size;

    public Product(String name, Integer size) {
        this.name = name;
        this.size = size;
    }

    public String name() {
        return name;
    }

    public Integer size() {
        return size;
    }

    @Override
    public String toString() {
        return "Product{" +
                "name='" + name + '\'' +
                ", size=" + size +
                '}';
    }
}

demo 打印

相关推荐
染指11102 小时前
45.第二阶段x86游戏实战2-hook监控实时抓取游戏lua
汇编·c++·windows·反游戏外挂·游戏逆向
我是苏苏16 小时前
Web开发:ABP框架6——appsetting.json的读取以及实例的注入
前端·windows·json
TPCloud16 小时前
windows 11编译安装ffmpeg(包含ffplay)
windows·ffmpeg·源码安装·mysys
password大鸭梨17 小时前
一个简单ASP.NET购物车设计
windows·microsoft·asp.net
Aniay_ivy19 小时前
Java中的不可变集合:性能与安全并重的最佳实践
java·windows·安全
积跬步至千里-积滴水成江海19 小时前
如何查看电脑关机时间
windows·系统安全
喜欢打篮球的普通人19 小时前
Rust面向对象特性
开发语言·windows·rust
晨曦_子画19 小时前
C#中:Any() 与 Count,选择哪一个??
开发语言·windows·c#
醇氧20 小时前
【Windows】CMD命令学习——系统命令
windows
人生の三重奏21 小时前
windows虚拟环境搭建
windows·python·虚拟环境