小蔡学Java

Java之设计模式 (十四)

2023-09-24 17:56 1569 0 设计模式 设计模式过滤器模式

过滤器模式(Filter Pattern)

  Java 过滤器模式(Filter Pattern)是一种结构型设计模式,它允许你使用不同的标准来过滤一组对象,从而去除其中不需要的元素。 使用场景

  • 当你需要从一个集合中过滤出一部分元素时。

  • 当你需要根据不同的标准来过滤同一个集合时。

  • 当你需要在一个集合中根据不同标准来组合过滤器时。

代码实现

  假设有一个 Person 类,包含姓名、年龄、性别等属性,我们可以定义一个过滤器接口 Filter,其中包含一个过滤方法 filter,用于过滤出符合某种条件的人。


public interface Filter {
    List<Person> filter(List<Person> persons);
}

  定义实现了 Filter 接口的具体过滤器

public class MaleFilter implements Filter {
    @Override
    public List<Person> filter(List<Person> persons) {
        return persons.stream()
                .filter(person -> person.getGender().equals("MALE"))
                .collect(Collectors.toList());
    }
}
public class FemaleFilter implements Filter {
    @Override
    public List<Person> filter(List<Person> persons) {
        return persons.stream()
                .filter(person -> person.getGender().equals("FEMALE"))
                .collect(Collectors.toList());
    }
}
public class AgeFilter implements Filter {
    @Override
    public List<Person> filter(List<Person> persons) {
        return persons.stream()
                .filter(person -> person.getAge() > 18)
                .collect(Collectors.toList());
    }
}

  最后,我们可以定义一个 FilterChain 类,用于组合多个过滤器

public class FilterChain implements Filter {
    private List<Filter> filters;

    public FilterChain(List<Filter> filters) {
        this.filters = filters;
    }

    @Override
    public List<Person> filter(List<Person> persons) {
        List<Person> result = persons;
        for (Filter filter : filters) {
            result = filter.filter(result);
        }
        return result;
    }
}

  这样,我们就可以使用过滤器来过滤出符合不同条件的人了

public static void main(String[] args) {
    List<Person> persons = new ArrayList<>();
    persons.add(new Person("Tom", 20, "MALE"));
    persons.add(new Person("Lucy", 19, "FEMALE"));
    persons.add(new Person("John", 17, "MALE"));
    persons.add(new Person("Lily", 21, "FEMALE"));

    Filter maleFilter = new MaleFilter();
    Filter femaleFilter = new FemaleFilter();
    Filter ageFilter = new AgeFilter();

    FilterChain maleAndAgeFilter = new FilterChain(Arrays.asList(maleFilter, ageFilter));
    FilterChain femaleAndAgeFilter = new FilterChain(Arrays.asList(femaleFilter, ageFilter));

    System.out.println("Male and age filter:");
    maleAndAgeFilter.filter(persons).forEach(System.out::println);
    //Person(name=Tom, age=20, gender=MALE)
    //Person(name=Lily, age=21, gender=FEM

    System.out.println("Female and age filter:");
    femaleAndAgeFilter.filter(persons).forEach(System.out::println);
    //Person(name=Lily, age=21, gender=FEMALE)
}

使用小结

  滤器模式的核心是 Filter 接口,该接口包含了一个方法 filter(),用于对对象进行过滤。根据具体实现,filter() 方法可以接受一个对象作为参数,然后根据特定的标准判断该对象是否应该被过滤掉。过滤器模式在Java中可以应用于许多场景,例如:

  • Web开发中,对HTTP请求进行过滤,例如身份验证,日志记录等。

  • 在Spring框架中,过滤器可以用于过滤请求并对请求进行预处理,例如对请求参数进行验证等。

  • Java 中的 Stream API 提供了丰富的过滤器方法,如 filter()、distinct()、map() 等

  •   过滤器模式可以用于任何需要对数据进行过滤和处理的场景。

评论( 0 )

  • 博主 Mr Cai
  • 坐标 河南 信阳
  • 标签 Java、SpringBoot、消息中间件、Web、Code爱好者

文章目录