用户登录
用户注册

分享至

设计模式之过滤器模式

  • 作者: 率德布耀布耀德ljw
  • 来源: 51数据库
  • 2022-09-23

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


实现

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

过滤器模式的 UML 图

步骤 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 ]


软件
前端设计
程序设计
Java相关