设计模式-过滤器模式

文章结构 -什么是过滤器模式-意义 -实例 -解释 -图解

过滤器模式:

过滤器模式(Filter Pattern)或者称之为标准模式(Criteria Pattern)这是一种结构型的设计模式,通用不同逻辑之间的运算来实现将他们联系起来,通过结合多种形式的标准来获取单一的标准,就像是逻辑运算符一样,在通过多个逻辑运算之后只是得到了一种结果 如:今天和花10快去按&&今天我花五块钱 那么这个结果经过“与”运算符的出来的结果一定是false;

意义:

存在的意义,加强了一个接口下,多个功能的灵活性,可以更好的拆分下来,用于方法的组合

实例

步骤一:创建顶层类Persion

Person.java
public class Person {

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

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

    public String getName() {
        return name;
    }
    public String getGender() {
        return gender;
    }
    public String getMaritalStatus() {
        return maritalStatus;
    }
}
复制代码

步骤二:创建一个标准的接口并提供一个meetCriteria的集合的人的方法

Criteria.java

import java.util.List;

public interface Criteria {
    public List<Person> meetCriteria(List<Person> persons);
}
复制代码

步骤三:给Criteria接口提供具体的实现,每个类里面的方法都有自己的实现

CriteriaMale: 传入一个persons 将该persons里面的男人过滤出来
CriteriaFemale: 传入一个persons 将该persons里面的女人过滤出来
CriteriaSingle: 传入一个persons 将该persons里面的单身的人过滤出来
AndCriteria: 传入两个Criteria的实现类,作为规则 分别调用里面的meet方法 将两种人的分类进行And条件过滤
OrCriteria:传入两个Criteria的实现类,作为规则 分别调用里面的meet方法 将两种人的分类进行Or条件过滤

CriteriaMale.java
import java.util.ArrayList;
import java.util.List;

public class CriteriaMale implements Criteria {

    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> malePersons = new ArrayList<Person>();
        for (Person person : persons) {
            if(person.getGender().equalsIgnoreCase("MALE")){
                malePersons.add(person);
            }
        }
        return malePersons;
    }
}
CriteriaFemale.java
        import java.util.ArrayList;
        import java.util.List;

public class CriteriaFemale implements Criteria {

    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> femalePersons = new ArrayList<Person>();
        for (Person person : persons) {
            if(person.getGender().equalsIgnoreCase("FEMALE")){
                femalePersons.add(person);
            }
        }
        return femalePersons;
    }
}
CriteriaSingle.java
        import java.util.ArrayList;
        import java.util.List;

public class CriteriaSingle implements Criteria {

    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> singlePersons = new ArrayList<Person>();
        for (Person person : persons) {
            if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){
                singlePersons.add(person);
            }
        }
        return singlePersons;
    }
}
AndCriteria.java
        import java.util.List;

public class AndCriteria implements Criteria {

    private Criteria criteria;
    private Criteria otherCriteria;

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

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

public class OrCriteria implements Criteria {

    private Criteria criteria;
    private Criteria otherCriteria;

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

    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> firstCriteriaItems = criteria.meetCriteria(persons);
        List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);

        for (Person person : otherCriteriaItems) {
            if(!firstCriteriaItems.contains(person)){
                firstCriteriaItems.add(person);
            }
        }
        return firstCriteriaItems;
    }
}
复制代码

步骤四:使用不同分类人的方法,将他们结合起来进行过滤

CriteriaPatternDemo.java
import com.jayway.jsonpath.Criteria;

import java.util.ArrayList;
import java.util.List;

public class CriteriaPatternDemo {
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<Person>();

        persons.add(new Person("Robert","Male", "Single"));
        persons.add(new Person("John","Male", "Married"));
        persons.add(new Person("Laura","Female", "Married"));
        persons.add(new Person("Diana","Female", "Single"));
        persons.add(new Person("Mike","Male", "Single"));
        persons.add(new Person("Bobby","Male", "Single"));

        Criteria male = new CriteriaMale();
        Criteria female = new CriteriaFemale();
        Criteria single = new CriteriaSingle();
        Criteria singleMale = new AndCriteria(single, male);
        Criteria singleOrFemale = new OrCriteria(single, female);

        System.out.println("Males: ");
        printPersons(male.meetCriteria(persons));

        System.out.println("\nFemales: ");
        printPersons(female.meetCriteria(persons));

        System.out.println("\nSingle Males: ");
        printPersons(singleMale.meetCriteria(persons));

        System.out.println("\nSingle Or Females: ");
        printPersons(singleOrFemale.meetCriteria(persons));
    }

    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()
                    +" ]");
        }
    }
}
复制代码

解释+图解: 上面代码我按照图形进行分类分为ABCDEFG (除Proson类)

当我们提供一个标准的集合时:并同时提供四个实现类,且实现类有相同的功能,并且提供了可以将其功能进行组合的方法那么显而易见 A:标准 BCDEF:就是具体的实现 而E:就是调用的Demo

当我需要进行过滤一个集合里面的男人的时候就创建E:的对象调用E的meetCriteria();方法就可以过滤一个男人,当我想过滤一个男人和判断这个男人是单身的时候,可以创建一个B:的对象并且将E:和F:的对象传入就可以做到
图片下载地址
过滤器模式图片.png

差一个单身类:图比较清晰

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享