Filter Pattern in Java - GeeksforGeeks

17 Mar, 2021
Filter pattern or Criteria pattern is a design pattern that enables developers to filter a set of objects using different criteria and chaining them in a decoupled way through logical operations.
Procedure:
Create a class on which Criteria is to be applied.Create an interface for Criteria.Create concrete classes implementing the Criteria interface.Use different Criteria and their combination to filter out persons.Verify the output
Create a class on which Criteria is to be applied.
Create an interface for Criteria.
Create concrete classes implementing the Criteria interface.
Use different Criteria and their combination to filter out persons.
Verify the output
Implementation :
We’re going to create a Person object, Criteria interface, and concrete classes implementing this interface to filter the list of Person objects. CriteriaPatternDemo, our demo class uses Criteria objects to filter List of Person objects based on various criteria and their combinations.
Step 1: Create a class on which Criteria are to be applied.
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;
   }    
}
Step 2: Create an interface for Criteria.
Criteria.java
import java.util.List;

public interface Criteria {
   public List<Person> meetCriteria(List<Person> persons);
}
Step 3: Create concrete classes implementing the Criteria interface.
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;
   }
}
Step 4: Use different Criteria and their combination to filter out persons.
CriteriaPatternDemo.java
Java
// Importing ArrayList and List class // from java.util package import java.util.ArrayList;import java.util.List;  // Class// Main classpublic class CriteriaPatternDemo {      // Main driver method   public static void main(String[] args) {            // Creating a onbject of List in main() method     // Declaring object of user-defined datatype 'Person'      List<Person> persons = new ArrayList<Person>();             // Adding elements to the object created above     // using the add() method of List     // Custom entries       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);        // Display message       System.out.println("Males: ");      printPersons(male.meetCriteria(persons));        // Display message       System.out.println("\nFemales: ");      printPersons(female.meetCriteria(persons));        // Display message       System.out.println("\nSingle Males: ");      printPersons(singleMale.meetCriteria(persons));        // Display message       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() + " ]");      }   }      }
Step 5: Verify the output.
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-Design-Patterns
Java
Java
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Different ways of Reading a text file in Java
Constructors in Java
Stream In Java
Generics in Java
Exceptions in Java
Functional Interfaces in Java
Comparator Interface in Java with Examples
HashMap get() Method in Java
Strings in Java
StringBuilder Class in Java with Examples