美文网首页
过滤器模式

过滤器模式

作者: right_33cb | 来源:发表于2018-10-28 11:57 被阅读0次

    转:http://www.runoob.com/design-pattern/filter-pattern.html

    过滤器模式

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

    实现

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

    步骤 1

    创建一个类,在该类上应用标准。

    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;

      }  }

    步骤 2

    为标准(Criteria)创建一个接口。

    Criteria.java

    import java.util.List;

    public interface Criteria {  public List<Person> meetCriteria(List<Person> persons);}

    步骤 3

    创建实现了 Criteria 接口的实体类。

    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;

      }}

    步骤4

    使用不同的标准(Criteria)和它们的结合来过滤 Person 对象的列表。

    CriteriaPatternDemo.java

    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()            +" ]");

          }  }      }

    步骤 5

    执行程序,输出结果:

    Males:

     Person : [ Name : Robert, Gender : Male, Marital Status : Single ]

    Person : [ Name : John, Gender : Male, Marital Status : Married ]

    Person : [ Name : Mike, Gender : Male, Marital Status : Single ]

    Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]

    Females:

     Person : [ Name : Laura, Gender : Female, Marital Status : Married ]

    Person : [ Name : Diana, Gender : Female, Marital Status : Single ]

    Single Males: 

    Person : [ Name : Robert, Gender : Male, Marital Status : Single ]

    Person : [ Name : Mike, Gender : Male, Marital Status : Single ]

    Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]

    Single Or Females: 

    Person : [ Name : Robert, Gender : Male, Marital Status : Single ]

    Person : [ Name : Diana, Gender : Female, Marital Status : Single ]

    Person : [ Name : Mike, Gender : Male, Marital Status : Single ]

    Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]

    Person : [ Name : Laura, Gender : Female, Marital Status : Married ]

    相关文章

      网友评论

          本文标题:过滤器模式

          本文链接:https://www.haomeiwen.com/subject/beqnoftx.html