Java设计模式(八)过滤器模式

一、概要

过滤器模式是一种结构型设计模式,它允许通过一系列条件来筛选对象,并提供一种灵活的方式来组合和操作这些条件。过滤器模式将过滤条件封装成独立的过滤器类,然后使用这些过滤器来过滤对象集合,以满足特定的条件。

二、代码

以下是一个示例代码,说明过滤器模式的使用:

//1.表示一个产品
public class Product {
    //产品名称
    private String name;
    //产品类别
    private String category;
    //产品价格
    private double price;

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

    public String getName() {
        return name;
    }

    public String getCategory() {
        return category;
    }

    public double getPrice() {
        return price;
    }
}
//2.过滤器接口
public interface Filter {
    List<Product> filter(List<Product> products);
}
//3.具体过滤器:按类别过滤
public 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().equals(category)) {
                filteredProducts.add(product);
            }
        }
        return filteredProducts;
    }
}
//4.具体过滤器:按价格过滤
public class PriceFilter implements Filter{
    private double maxPrice;

    public PriceFilter(double maxPrice) {
        this.maxPrice = maxPrice;
    }

    @Override
    public List<Product> filter(List<Product> products) {
        List<Product> filteredProducts = new ArrayList<>();
        for (Product product : products) {
            if (product.getPrice() <= maxPrice) {
                filteredProducts.add(product);
            }
        }
        return filteredProducts;
    }
}
//5.测试类
public class Test {
    public static void main(String[] args) {
        //创建产品列表
        List<Product> products = new ArrayList<>();
        products.add(new Product("iPhone", "Electronics", 999.99));
        products.add(new Product("iPad", "Electronics", 799.99));
        products.add(new Product("MacBook", "Electronics", 1999.99));
        products.add(new Product("Shirt", "Clothing", 29.99));
        products.add(new Product("Jeans", "Clothing", 49.99));

        //过滤类别
        Filter electronicsFilter = new CategoryFilter("Electronics");
        List<Product> electronicsProducts = electronicsFilter.filter(products);
        System.out.println("Electronics products:");
        for (Product product : electronicsProducts) {
            System.out.println(product.getName());
        }

        //过滤价格
        Filter priceFilter = new PriceFilter(50.0);
        List<Product> cheapProducts = priceFilter.filter(products);
        System.out.println("Cheap products:");
        for (Product product : cheapProducts) {
            System.out.println(product.getName());
        }
    }
}

在上述代码中,我们有一个产品类 Product,它包含了产品的名称、类别和价格。我们使用过滤器模式来过滤产品集合。

Filter 是过滤器接口,定义了过滤器的方法 filter()。

CategoryFilter 和 PriceFilter 是具体的过滤器实现类,分别用于按类别和价格进行过滤。它们实现了 Filter 接口,并在 filter() 方法中根据特定的条件进行过滤操作。

在测试代码中,我们创建了一个产品集合,并使用过滤器来筛选出满足特定条件的产品。首先,我们使用 CategoryFilter 过滤器筛选出类别为 “Electronics” 的产品,并打印出它们的名称。然后,我们使用 PriceFilter 过滤器筛选出价格低于等于 50.0 的产品,并打印出它们的名称。

通过过滤器模式,我们可以灵活地组合和使用不同的过滤器来满足不同的筛选需求,而不需要修改原有的产品类。这样可以提高代码的可维护性和可扩展性。

经验分享 程序员 微信小程序 职场和发展