10.14

过滤器模式

下面是一个简单的Java代码展示示例,展示了经过滤器模型的现实:

import java.util.ArrayList;
import java.util.List;

// 实体类
class Product {
    private String name;
    private String category;

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

    public String getName() {
        return name;
    }

    public String getCategory() {
        return category;
    }
}

// 过滤器接口
interface Filter {
    List<Product> filter(List<Product> products);
}

// 具体过滤器实现类:按类别过滤
class CategoryFilter implements Filter {
    private String category;

    public CategoryFilter(String category) {
        this.category = category;
    }

    @Override
    public List<Product> filter(List<Product> products) {
        List<Product> filteredProducts = new ArrayList<>();
        for (Product product : products) {
            if (product.getCategory().equalsIgnoreCase(category)) {
                filteredProducts.add(product);
            }
        }
        return filteredProducts;
    }
}

// 具体过滤器实现类:按名称过滤
class NameFilter implements Filter {
    private String name;

    public NameFilter(String name) {
        this.name = name;
    }

    @Override
    public List<Product> filter(List<Product> products) {
        List<Product> filteredProducts = new ArrayList<>();
        for (Product product : products) {
            if (product.getName().equalsIgnoreCase(name)) {
                filteredProducts.add(product);
            }
        }
        return filteredProducts;
    }
}

// 客户端代码
public class FilterPatternExample {
    public static void main(String[] args) {
        // 创建产品列表
        List<Product> products = new ArrayList<>();
        products.add(new Product("iPhone", "Electronics"));
        products.add(new Product("MacBook", "Electronics"));
        products.add(new Product("T-shirt", "Clothing"));
        products.add(new Product("Jeans", "Clothing"));

        // 创建过滤器
        Filter categoryFilter = new CategoryFilter("Electronics");
        Filter nameFilter = new NameFilter("iPhone");

        // 进行过滤操作
        List<Product> filteredProducts = categoryFilter.filter(products);
        System.out.println("Filtered Products (Category):");
        printProducts(filteredProducts);

        filteredProducts = nameFilter.filter(products);
        System.out.println("Filtered Products (Name):");
        printProducts(filteredProducts);
    }

    private static void printProducts(List<Product> products) {
        for (Product product : products) {
            System.out.println(product.getName() + " - " + product.getCategory());
        }
    }
}
	

在上面的例子中,我们首先确定了一个实体类Product,它具有名称和类别属性。

然后,我们确定了过滤器接口Filter,其中包含一个filter()方法,用于根据过滤器产品列表。

着着,我们发现了两个具体的过滤器实际类:CategoryFilterNameFilterCategoryFilter通过指定类别来过滤产品列表,NameFilter通过指定名称来过滤产品产品列表。这两个滤器类实现了Filter接口中的filter()方法。

最后,在客户端代码中,我们创建了一个产品列表,并创建了两个工具实例:`CategoryFilter

NameFilter`。然后,我们分别使用这两个过滤器来过滤器产品列表,并将过滤器结果打印到控制台上。

通过上面说明的例子可以看出,滤液器模型可以很方便地实现对一个列表中的元素进行过滤的功能,同时也能足够方便地拖放展开和修改滤器的现实,符合开闭原则。

posted @   liuxuechao  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示