过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算用解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
实现
我们将创建一个 Person 对象、Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表。CriteriaPatternDemo,我们的演示类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Person 对象的列表。

设计模式之过滤器模式-LMLPHP

点击(此处)折叠或打开

  1. public class Person {
  2.    
  3.    private String name;
  4.    private String gender;
  5.    private String maritalStatus;
  6.  
  7.    public Person(String name,String gender,String maritalStatus){
  8.       this.name = name;
  9.       this.gender = gender;
  10.       this.maritalStatus = maritalStatus;
  11.    }
  12.  
  13.    public String getName() {
  14.       return name;
  15.    }
  16.    public String getGender() {
  17.       return gender;
  18.    }
  19.    public String getMaritalStatus() {
  20.       return maritalStatus;
  21.    }
  22. }

点击(此处)折叠或打开

  1. import java.util.List;
  2.  
  3. public interface Criteria {
  4.    public List<Person> meetCriteria(List<Person> persons);
  5. }


点击(此处)折叠或打开

  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. public class CriteriaMale implements Criteria {
  5.  
  6.    @Override
  7.    public List<Person> meetCriteria(List<Person> persons) {
  8.       List<Person> malePersons = new ArrayList<Person>();
  9.       for (Person person : persons) {
  10.          if(person.getGender().equalsIgnoreCase("MALE")){
  11.             malePersons.add(person);
  12.          }
  13.       }
  14.       return malePersons;
  15.    }
  16. }

点击(此处)折叠或打开

  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. public class CriteriaFemale implements Criteria {
  5.  
  6.    @Override
  7.    public List<Person> meetCriteria(List<Person> persons) {
  8.       List<Person> femalePersons = new ArrayList<Person>();
  9.       for (Person person : persons) {
  10.          if(person.getGender().equalsIgnoreCase("FEMALE")){
  11.             femalePersons.add(person);
  12.          }
  13.       }
  14.       return femalePersons;
  15.    }
  16. }


点击(此处)折叠或打开

  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. public class CriteriaSingle implements Criteria {
  5.  
  6.    @Override
  7.    public List<Person> meetCriteria(List<Person> persons) {
  8.       List<Person> singlePersons = new ArrayList<Person>();
  9.       for (Person person : persons) {
  10.          if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){
  11.             singlePersons.add(person);
  12.          }
  13.       }
  14.       return singlePersons;
  15.    }
  16. }

点击(此处)折叠或打开

  1. import java.util.List;
  2.  
  3. public class AndCriteria implements Criteria {
  4.  
  5.    private Criteria criteria;
  6.    private Criteria otherCriteria;
  7.  
  8.    public AndCriteria(Criteria criteria, Criteria otherCriteria) {
  9.       this.criteria = criteria;
  10.       this.otherCriteria = otherCriteria;
  11.    }
  12.  
  13.    @Override
  14.    public List<Person> meetCriteria(List<Person> persons) {
  15.       List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);
  16.       return otherCriteria.meetCriteria(firstCriteriaPersons);
  17.    }
  18. }


点击(此处)折叠或打开

  1. import java.util.List;
  2.  
  3. public class OrCriteria implements Criteria {
  4.  
  5.    private Criteria criteria;
  6.    private Criteria otherCriteria;
  7.  
  8.    public OrCriteria(Criteria criteria, Criteria otherCriteria) {
  9.       this.criteria = criteria;
  10.       this.otherCriteria = otherCriteria;
  11.    }
  12.  
  13.    @Override
  14.    public List<Person> meetCriteria(List<Person> persons) {
  15.       List<Person> firstCriteriaItems = criteria.meetCriteria(persons);
  16.       List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);
  17.  
  18.       for (Person person : otherCriteriaItems) {
  19.          if(!firstCriteriaItems.contains(person)){
  20.            firstCriteriaItems.add(person);
  21.          }
  22.       }
  23.       return firstCriteriaItems;
  24.    }
  25. }


点击(此处)折叠或打开

  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. public class CriteriaPatternDemo {
  5.    public static void main(String[] args) {
  6.       List<Person> persons = new ArrayList<Person>();
  7.  
  8.       persons.add(new Person("Robert","Male", "Single"));
  9.       persons.add(new Person("John","Male", "Married"));
  10.       persons.add(new Person("Laura","Female", "Married"));
  11.       persons.add(new Person("Diana","Female", "Single"));
  12.       persons.add(new Person("Mike","Male", "Single"));
  13.       persons.add(new Person("Bobby","Male", "Single"));
  14.  
  15.       Criteria male = new CriteriaMale();
  16.       Criteria female = new CriteriaFemale();
  17.       Criteria single = new CriteriaSingle();
  18.       Criteria singleMale = new AndCriteria(single, male);
  19.       Criteria singleOrFemale = new OrCriteria(single, female);
  20.  
  21.       System.out.println("Males: ");
  22.       printPersons(male.meetCriteria(persons));
  23.  
  24.       System.out.println("\nFemales: ");
  25.       printPersons(female.meetCriteria(persons));
  26.  
  27.       System.out.println("\nSingle Males: ");
  28.       printPersons(singleMale.meetCriteria(persons));
  29.  
  30.       System.out.println("\nSingle Or Females: ");
  31.       printPersons(singleOrFemale.meetCriteria(persons));
  32.    }
  33.  
  34.    public static void printPersons(List<Person> persons){
  35.       for (Person person : persons) {
  36.          System.out.println("Person : [ Name : " + person.getName()
  37.             +", Gender : " + person.getGender()
  38.             +", Marital Status : " + person.getMaritalStatus()
  39.             +" ]");
  40.       }
  41.    }
  42. }
https://www.runoob.com/design-pattern/filter-pattern.html



09-04 00:19