软件设计模式之过滤器模式

软件设计模式之过滤器模式

过滤器模式或条件模式是一种设计模式,使开发人员可以使用不同的条件过滤一组对象,并通过逻辑操作以分离的方式链接它们。

技术开发 编程 技术框架 技术发展

 

软件设计模式之过滤器模式

过滤器模式或条件模式是一种设计模式,使开发人员可以使用不同的条件过滤一组对象,并通过逻辑操作以分离的方式链接它们。

过滤器模式或条件模式是一种设计模式,使开发人员可以使用不同的条件过滤一组对象,并通过逻辑操作以分离的方式链接它们。这种类型的设计模式属于结构模式,因为该模式组合了多个条件以获得单个条件。

实作

我们将创建一个Person对象,Criteria接口和实现此接口的具体类,以过滤Person对象的列表 。CriteriaPatternDemo,我们的演示类使用Criteria对象根据各种条件及其组合来过滤Person对象的List 。

filter_pattern_uml_diagram.jpg

第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.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步

使用不同的条件及其组合来过滤人员。

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 ]


技术开发 编程 技术框架 技术发展