Latest web development tutorials

Filter Pattern

Filter mode (Filter Pattern) or standard mode (Criteria Pattern) is a design model that allows developers to use different criteria to filter a set of objects, through logical operations to decouple way to connect them. This type of design pattern of a structural schema, which combines more criteria obtain a single standard.

achieve

We will create aPersonobject, Criteria entity class interface and implementation of the interface to filter the list ofPersonobjects.CriteriaPatternDemo,our demonstration classes useCriteriaobjects, based on various criteria and combinations thereof to filter the list ofPersonobjects.

Filter pattern UML diagram

step 1

Create a class, on the application of standards in this class.

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 standard (Criteria).

Criteria.java

import java.util.List;

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

Step 3

Create entity classes realizedCriteriainterface.

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

Using different criteria (Criteria) and combinations thereof to filter the list ofPersonobjects.

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

Step 5

Verify 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]