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 打印

相关推荐
桑榆41632 分钟前
双系统(Windows + Ubuntu)安装流程
linux·windows·ubuntu
走,带你去玩10 小时前
windows电脑 trae对接lanhu-mcp
windows
戒了,最后一次15 小时前
Windows 安装 FFmpeg 完整教程(附环境变量配置 + 常用命令示例)
windows·ffmpeg
liulilittle17 小时前
DeepSeek Harness 自定义模型提供商配置
前端·javascript·人工智能·windows·llm·deepseek·harness
fruge18 小时前
Windows部署MiGPT GUI:小爱音箱接入大模型、TTS与自定义人设
windows
源码学社19 小时前
DeerFlow Windows 本地运行教程(uv)
windows·uv·沙箱·deerflow·超级智能体·deerflow安装
Sombra_Olivia19 小时前
复现Windows Server服务RPC请求缓冲区溢出漏洞(MS08067)
网络·windows·安全·web安全·网络安全·渗透测试·vulhub
-天道酬勤-19 小时前
查看Windows电脑开机时间
windows·电脑
该用户可能存在20 小时前
【Win11优化】StartAllBack实战:解决任务栏合并、右键折叠等痛点
windows·性能优化·win11·windows 11·startallback·任务栏·开始菜单
特立独行的猫a1 天前
Windows安装Rust环境 Clang替代GCC MinGW环境LLVM工具链(详细教程)
开发语言·windows·rust·mingw·环境搭建·llvm