Java过滤器模式

介绍

什么是过滤模式?

比如水泥制造, 沙子是用来混水泥的,如果沙子中大的石头太多那么混出来的水泥就不行很容易就裂了,所以在混水泥前需要使用过滤网将沙子中的大石块给过滤掉 而我们今天学的过滤器就好比就是这过滤沙子的过滤网

比如: 有一万个女方相亲的信息 那么有一个男的来相亲 他说我需要xxx条件的 女方信息 那么我们就可以通过,过滤来将不需要的信息过滤掉显示给男方满足条件的女方信息

案例

我们下面这个案例主要就是过滤 ( 性别, 单身 ) 至于其他的过滤都可参考这个案例来写

java过滤器防止脚本注入 java过滤器模式_java过滤器防止脚本注入

java过滤器防止脚本注入 java过滤器模式_java过滤器防止脚本注入_02

**Person ** 实体类

public class Person {

    private String name;
    private String gender;
    private String maritalStatus;

    public Person(String name,String gender,String maritalStatus){
         = name;
        this.gender = gender;
        this.maritalStatus = maritalStatus;
    }

    public String getName() {
        return name;
    }
    public String getGender() {
        return gender;
    }
    public String getMaritalStatus() {
        return maritalStatus;
    }
}

filtraCriteria 过滤接口

//过滤接口
public interface filtraCriteria {
    //传入需要过滤的内容
    public List<Person> meetCriteria(List<Person> persons);
}

实现过滤接口的实现类 CriteriaFemale

//过滤类
public class CriteriaFemale implements filtraCriteria {
    //放行 性别为女的
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> femalePersons = new ArrayList<Person>();
        persons.stream()
                .filter(gender -> gender.getGender().equalsIgnoreCase("女"))
                .forEach(femalePersons::add);

        return femalePersons;
    }
}

实现过滤接口的实现类 CriteriaMale

//过滤类
public class CriteriaMale implements filtraCriteria {
    //放行 性别为男的
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> malePersons = new ArrayList<Person>();

        persons.stream()
                .filter(gender->gender.getGender().equalsIgnoreCase("男"))
                .forEach(malePersons::add);

        return malePersons;
    }
}

实现过滤接口的实现类 CriteriaSingle

//过滤类
public class CriteriaSingle implements filtraCriteria {
    //放行  是单身的
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> singlePersons = new ArrayList<Person>();
        persons.stream()
                .filter(maritalStatus->maritalStatus.getMaritalStatus().equalsIgnoreCase("单身"))
                .forEach(singlePersons::add);

        return singlePersons;
    }
}

实现过滤接口的组合实现类 AndCriteria

//组合过滤类   并且
public class AndCriteria implements filtraCriteria {

    private filtraCriteria criteria;
    private filtraCriteria otherCriteria;

    public AndCriteria(filtraCriteria criteria, filtraCriteria otherCriteria) {
        this.criteria = criteria;
        this.otherCriteria = otherCriteria;
    }

    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);
        List<Person> people = otherCriteria.meetCriteria(firstCriteriaPersons);
        return people;
    }
}

我们上面实现了 两个过滤类的组合 当然 三个 四个都行 看你自己设计了

实现过滤接口的组合实现类 OrCriteri

//组合过滤类   或者
public class OrCriteria implements filtraCriteria {

    private filtraCriteria criteria;
    private filtraCriteria otherCriteria;

    public OrCriteria(filtraCriteria criteria, filtraCriteria otherCriteria) {
        this.criteria = criteria;
        this.otherCriteria = otherCriteria;
    }

    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> firstORother=new ArrayList<>();


        List<Person> firstCriteriaItems = criteria.meetCriteria(persons);
        firstCriteriaItems.stream().forEach(firstORother::add);

        List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);
        otherCriteriaItems.stream().forEach(firstORother::add);

        return  firstORother;
    }
}

测试 CriteriaPatternDemo

public class CriteriaPatternDemo {
    //遍历集合中信息
    public static void printPersons(List<Person> persons){
        for (Person person : persons) {
            System.out.println("Person : [ Name : " + person.getName()
                    +", Gender : " + person.getGender()
                    +", Marital Status : " + person.getMaritalStatus()
                    +" ]");
        }
    }

    public static void main(String[] args) {
        //-------------------需要过滤的信息----------------------------------------
        List<Person> persons = new ArrayList<Person>();
        persons.add(new Person("Robert","男", "单身"));
        persons.add(new Person("John","男", "已婚的"));
        persons.add(new Person("Laura","女", "已婚的"));
        persons.add(new Person("Diana","女", "单身"));
        persons.add(new Person("Mike","男", "单身"));
        persons.add(new Person("Bobby","男", "单身"));
// ------------------创建过滤条件类--------------------
        filtraCriteria male = new CriteriaMale();  //放行性别 男
        filtraCriteria female = new CriteriaFemale(); //放行性别 女
        filtraCriteria single = new CriteriaSingle();  //放行 单身
//--------------------创建组合过滤类-----------------------------
        filtraCriteria singleMale = new AndCriteria(single, male);   //放行单身 并且 性别为男
        filtraCriteria andCriteria=new AndCriteria(single, female);//放行单身 并且 性别为女
        filtraCriteria singleOrFemale = new OrCriteria(single, female); //放行单身 或者性别为女
//-------------------打印过滤后的 信息-------------------
        System.out.println("男的: ");
        printPersons(male.meetCriteria(persons));
        System.out.println("\n女的: ");
        printPersons(female.meetCriteria(persons));

        System.out.println("\n单身 男的: ");
        printPersons(singleMale.meetCriteria(persons));

        System.out.println("\n单身  女的 ");
        printPersons(andCriteria.meetCriteria(persons));

        System.out.println("\n单身 或者 女的: ");
        printPersons(singleOrFemale.meetCriteria(persons));


    }


}
男的:
 Person : [ Name : Robert, Gender : 男, Marital Status : 单身 ]
 Person : [ Name : John, Gender : 男, Marital Status : 已婚的 ]
 Person : [ Name : Mike, Gender : 男, Marital Status : 单身 ]
 Person : [ Name : Bobby, Gender : 男, Marital Status : 单身 ]女的:
 Person : [ Name : Laura, Gender : 女, Marital Status : 已婚的 ]
 Person : [ Name : Diana, Gender : 女, Marital Status : 单身 ]单身 男的:
 Person : [ Name : Robert, Gender : 男, Marital Status : 单身 ]
 Person : [ Name : Mike, Gender : 男, Marital Status : 单身 ]
 Person : [ Name : Bobby, Gender : 男, Marital Status : 单身 ]单身 女的
 Person : [ Name : Diana, Gender : 女, Marital Status : 单身 ]单身 或者 女的:
 Person : [ Name : Robert, Gender : 男, Marital Status : 单身 ]
 Person : [ Name : Diana, Gender : 女, Marital Status : 单身 ]
 Person : [ Name : Mike, Gender : 男, Marital Status : 单身 ]
 Person : [ Name : Bobby, Gender : 男, Marital Status : 单身 ]
 Person : [ Name : Laura, Gender : 女, Marital Status : 已婚的 ]
 Person : [ Name : Diana, Gender : 女, Marital Status : 单身 ]