过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准

    实现
    ———————————————————

    我们将创建一个 Person 对象、Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表。CriteriaPatternDemo,我们的演示类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Person 对象的列表

    image.png

    1. 创建一个类,在该类上应用标准::

      //Person.java
      public class Person {

      1. private String name;<br /> private String gender;<br /> private String maritalStatus;
      2. public Person(String name,String gender,String maritalStatus){<br /> this.name = name;<br /> this.gender = gender;<br /> this.maritalStatus = maritalStatus;<br /> }
      3. public String getName() {<br /> return name;<br /> }<br /> public String getGender() {<br /> return gender;<br /> }<br /> public String getMaritalStatus() {<br /> return maritalStatus;<br /> }<br /> }
    2. 为标准(Criteria)创建一个接口::

      //Criteria.java
      import java.util.List;

      public interface Criteria {
      public List meetCriteria(List persons);
      }

    3. 创建实现了 Criteria 接口的实体类::

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

      public class CriteriaMale implements Criteria {

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

      //CriteriaFemale.java
      import java.util.ArrayList;
      import java.util.List;

      public class CriteriaFemale implements Criteria {

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

      //CriteriaSingle.java
      import java.util.ArrayList;
      import java.util.List;

      public class CriteriaSingle implements Criteria {

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

      //AndCriteria.java
      import java.util.List;

      public class AndCriteria implements Criteria {

      private Criteria criteria;<br />       private Criteria otherCriteria;
      
      public AndCriteria(Criteria criteria, Criteria otherCriteria) {<br />          this.criteria = criteria;<br />          this.otherCriteria = otherCriteria;<br />       }
      
      @Override<br />       public List<Person> meetCriteria(List<Person> persons) {<br />          List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);<br />          return otherCriteria.meetCriteria(firstCriteriaPersons);<br />       }<br />    }
      

      //OrCriteria.java
      import java.util.List;

      public class OrCriteria implements Criteria {

      private Criteria criteria;<br />       private Criteria otherCriteria;
      
      public OrCriteria(Criteria criteria, Criteria otherCriteria) {<br />          this.criteria = criteria;<br />          this.otherCriteria = otherCriteria;<br />       }
      
      @Override<br />       public List<Person> meetCriteria(List<Person> persons) {<br />          List<Person> firstCriteriaItems = criteria.meetCriteria(persons);<br />          List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);
      
         for (Person person : otherCriteriaItems) {<br />             if(!firstCriteriaItems.contains(person)){<br />               firstCriteriaItems.add(person);<br />             }<br />          }<br />          return firstCriteriaItems;<br />       }<br />    }
      
    4. 使用不同的标准(Criteria)和它们的结合来过滤 Person 对象的列表::

      //CriteriaPatternDemo.java
      import java.util.ArrayList;
      import java.util.List;

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

         persons.add(new Person("Robert","Male", "Single"));<br />          persons.add(new Person("John","Male", "Married"));<br />          persons.add(new Person("Laura","Female", "Married"));<br />          persons.add(new Person("Diana","Female", "Single"));<br />          persons.add(new Person("Mike","Male", "Single"));<br />          persons.add(new Person("Bobby","Male", "Single"));
      
         Criteria male = new CriteriaMale();<br />          Criteria female = new CriteriaFemale();<br />          Criteria single = new CriteriaSingle();<br />          Criteria singleMale = new AndCriteria(single, male);<br />          Criteria singleOrFemale = new OrCriteria(single, female);
      
         System.out.println("Males: ");<br />          printPersons(male.meetCriteria(persons));
      
         System.out.println("\nFemales: ");<br />          printPersons(female.meetCriteria(persons));
      
         System.out.println("\nSingle Males: ");<br />          printPersons(singleMale.meetCriteria(persons));
      
         System.out.println("\nSingle Or Females: ");<br />          printPersons(singleOrFemale.meetCriteria(persons));<br />       }
      
      public static void printPersons(List<Person> persons){<br />          for (Person person : persons) {<br />             System.out.println("Person : [ Name : " + person.getName()<br />                +", Gender : " + person.getGender()<br />                +", Marital Status : " + person.getMaritalStatus()<br />                +" ]");<br />          }<br />       }<br />    }