Java设计模式之-过滤器模式
1. 什么是过滤器模式
过滤器模式(Filter Pattern)或者标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算符(如 AND、OR)来连接这些标准。
2. 主要解决什么问题
过滤器模式主要解决了在软件开发中,我们经常需要对一些集合对象进行过滤的问题。这些过滤条件可能会非常复杂,包括多个条件和逻辑运算符。使用过滤器模式,我们可以将这些条件分解为多个单一的过滤器,然后将它们组合起来进行过滤,使得代码更加清晰,更易于维护。
3. 在什么时候我们需要使用过滤器模式
在以下几种情况下,我们可能需要使用过滤器模式:
当我们需要对一组对象根据某种标准进行过滤时。
当过滤标准可能会发生改变,或者在未来可能会出现新的过滤标准时。
4. 生活中的应用实例
过滤器模式就像我们在网购时使用的筛选功能。例如,在购买手机时,我们可能会根据价格、品牌、内存大小等多个标准进行筛选,这些标准可以单独使用,也可以组合使用。
5. 优点
灵活性好:过滤器模式可以灵活地使用不同的标准来过滤一组对象,还可以通过逻辑运算符来组合这些标准。
扩展性强:当需要增加新的过滤标准时,我们只需要添加新的过滤器,而无需修改现有代码。
6. 缺点
如果过滤标准过多,可能会导致系统中存在大量的过滤器类,增加了系统的复杂性。
7. 使用场景
过滤器模式主要用在需要对一组对象根据某种标准进行过滤的场景中,例如电商平台的商品筛选、邮件过滤等。
8. 代码示例
// 定义一个对象
public class Phone {
private String brand;
private int price;
// getters and setters
}
// 定义一个过滤器接口
public interface Filter {
List<Phone> filter(List<Phone> phones);
}
// 定义一个具体的过滤器
public class BrandFilter implements Filter {
private String brand;
public BrandFilter(String brand) {
this.brand = brand;
}
@Override
public List<Phone> filter(List<Phone> phones) {
return phones.stream()
.filter(phone -> phone.getBrand().equals(brand))
.collect(Collectors.toList());
}
}
// 定义另一个具体的过滤器
public class PriceFilter implements Filter {
private int maxPrice;
public PriceFilter(int maxPrice) {
this.maxPrice = maxPrice;
}
@Override
public List<Phone> filter(List<Phone> phones) {
return phones.stream()
.filter(phone -> phone.getPrice() <= maxPrice)
.collect(Collectors.toList());
}
}
// 测试代码
public class Client {
public static void main(String[] args) {
List<Phone> phones = new ArrayList<>();
// 添加一些手机
Filter brandFilter = new BrandFilter("Apple");
List<Phone> applePhones = brandFilter.filter(phones);
Filter priceFilter = new PriceFilter(5000);
List<Phone> cheapPhones = priceFilter.filter(phones);
}
}
在这个例子中,我们首先创建了一组手机对象,然后使用BrandFilter根据品牌进行过滤,接着使用PriceFilter根据价格进行过滤。每个过滤器都是独立的,可以在这个例子中,我们首先创建了一组手机对象,然后使用BrandFilter根据品牌进行过滤,接着使用PriceFilter根据价格进行过滤。每个过滤器都是独立的,可以单独使用,也可以组合使用。这就是过滤器模式的魅力所在,它使得代码更加清晰,更易于维护。