203过滤器模式

128 阅读1分钟

定义

过滤器模式(Intercepting Filter Pattern),又称标准模式(Criteria Pattern),主要用于统一接收并过滤客户端的请求,根据过滤器的选择,将请求传送给对应的目标处理程序。

主要角色:

过滤对象:需要过滤的对象。

过滤条件接口:抽象过滤条件的接口。

具体的过滤条件:根据需要实现过滤条件接口的具体过滤条件。

类图(类似,不准确)****

图片1.png

代码

public class FilterPattern {
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("com.mxy.dp.Peter", "MALE", 24));
        persons.add(new Person("Mary", "FEMALE", 22));
        persons.add(new Person("Bob", "MALE", 18));
        persons.add(new Person("Lina", "FEMALE", 20));
        persons.add(new Person("Luna", "FEMALE", 21));
        FilterCriteria maleFilter = new MaleFilter();
        List<Person> males = maleFilter.filterCriteria(persons);
        System.out.println("男的:" + males);
        FilterCriteria ageGreaterThan20 = new AgeGreaterThan20Filter();
        List<Person> ageThan20 = ageGreaterThan20.filterCriteria(persons);
        System.out.println("年龄大于20的人:" + ageThan20);
        FilterCriteria maleAndAgeGreaterThan20 = new MaleAndAgeGreaterThan20Filter();
        List<Person> personList = maleAndAgeGreaterThan20.filterCriteria(persons);
        System.out.println("男的且年龄大于20的人:" + personList);
    }
}
class Person {
    private String name;
    private String gender;  //性别
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Person(String name, String gender, int age) {
        this.name = name;
        this.gender = gender;
        this.age = age;
    }
    @Override
    public String toString() {
        return "com.mxy.dp.Person{" + "name='" + name + ''' +
                ", gender='" + gender + ''' +
                ", age=" + age + '}';
    }
}
interface FilterCriteria {
    List<Person> filterCriteria(List<Person> persons);
}
class MaleFilter implements FilterCriteria {
    @Override
    public List<Person> filterCriteria(List<Person> persons) {
        //通过流来处理
        return persons.stream()
                .filter(person -> Objects.equals(person.getGender(), "MALE"))
                .collect(Collectors.toList());
    }
}
class AgeGreaterThan20Filter implements FilterCriteria {
    @Override
    public List<Person> filterCriteria(List<Person> persons) {
        return persons.stream().filter(person -> person.getAge() > 20).collect(Collectors.toList());
    }
}
class MaleAndAgeGreaterThan20Filter implements FilterCriteria {
    @Override
    public List<Person> filterCriteria(List<Person> persons) {
        return persons.stream()
                .filter(person -> Objects.equals(person.getGender(), "MALE"))
                .filter(person -> person.getAge() > 20)
                .collect(Collectors.toList());
    }
}