过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准
实现
———————————————————
我们将创建一个 Person 对象、Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表。CriteriaPatternDemo,我们的演示类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Person 对象的列表

创建一个类,在该类上应用标准::
//Person.java
public class Person {private String name;<br /> private String gender;<br /> private String maritalStatus;public Person(String name,String gender,String maritalStatus){<br /> this.name = name;<br /> this.gender = gender;<br /> this.maritalStatus = maritalStatus;<br /> }public String getName() {<br /> return name;<br /> }<br /> public String getGender() {<br /> return gender;<br /> }<br /> public String getMaritalStatus() {<br /> return maritalStatus;<br /> }<br /> }
为标准(Criteria)创建一个接口::
//Criteria.java
import java.util.List;public interface Criteria {
public ListmeetCriteria(List persons);
}创建实现了 Criteria 接口的实体类::
//CriteriaMale.java
import java.util.ArrayList;
import java.util.List;public class CriteriaMale implements Criteria {
@Override<br /> public List<Person> meetCriteria(List<Person> persons) {<br /> List<Person> malePersons = new ArrayList<Person>();<br /> for (Person person : persons) {<br /> if(person.getGender().equalsIgnoreCase("MALE")){<br /> malePersons.add(person);<br /> }<br /> }<br /> return malePersons;<br /> }<br /> }//CriteriaFemale.java
import java.util.ArrayList;
import java.util.List;public class CriteriaFemale implements Criteria {
@Override<br /> public List<Person> meetCriteria(List<Person> persons) {<br /> List<Person> femalePersons = new ArrayList<Person>();<br /> for (Person person : persons) {<br /> if(person.getGender().equalsIgnoreCase("FEMALE")){<br /> femalePersons.add(person);<br /> }<br /> }<br /> return femalePersons;<br /> }<br /> }//CriteriaSingle.java
import java.util.ArrayList;
import java.util.List;public class CriteriaSingle implements Criteria {
@Override<br /> public List<Person> meetCriteria(List<Person> persons) {<br /> List<Person> singlePersons = new ArrayList<Person>();<br /> for (Person person : persons) {<br /> if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){<br /> singlePersons.add(person);<br /> }<br /> }<br /> return singlePersons;<br /> }<br /> }//AndCriteria.java
import java.util.List;public class AndCriteria implements Criteria {
private Criteria criteria;<br /> private Criteria otherCriteria; public AndCriteria(Criteria criteria, Criteria otherCriteria) {<br /> this.criteria = criteria;<br /> this.otherCriteria = otherCriteria;<br /> } @Override<br /> public List<Person> meetCriteria(List<Person> persons) {<br /> List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);<br /> return otherCriteria.meetCriteria(firstCriteriaPersons);<br /> }<br /> }//OrCriteria.java
import java.util.List;public class OrCriteria implements Criteria {
private Criteria criteria;<br /> private Criteria otherCriteria; public OrCriteria(Criteria criteria, Criteria otherCriteria) {<br /> this.criteria = criteria;<br /> this.otherCriteria = otherCriteria;<br /> } @Override<br /> public List<Person> meetCriteria(List<Person> persons) {<br /> List<Person> firstCriteriaItems = criteria.meetCriteria(persons);<br /> List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons); for (Person person : otherCriteriaItems) {<br /> if(!firstCriteriaItems.contains(person)){<br /> firstCriteriaItems.add(person);<br /> }<br /> }<br /> return firstCriteriaItems;<br /> }<br /> }使用不同的标准(Criteria)和它们的结合来过滤 Person 对象的列表::
//CriteriaPatternDemo.java
import java.util.ArrayList;
import java.util.List;public class CriteriaPatternDemo {
public static void main(String[] args) {
Listpersons = new ArrayList (); persons.add(new Person("Robert","Male", "Single"));<br /> persons.add(new Person("John","Male", "Married"));<br /> persons.add(new Person("Laura","Female", "Married"));<br /> persons.add(new Person("Diana","Female", "Single"));<br /> persons.add(new Person("Mike","Male", "Single"));<br /> persons.add(new Person("Bobby","Male", "Single")); Criteria male = new CriteriaMale();<br /> Criteria female = new CriteriaFemale();<br /> Criteria single = new CriteriaSingle();<br /> Criteria singleMale = new AndCriteria(single, male);<br /> Criteria singleOrFemale = new OrCriteria(single, female); System.out.println("Males: ");<br /> printPersons(male.meetCriteria(persons)); System.out.println("\nFemales: ");<br /> printPersons(female.meetCriteria(persons)); System.out.println("\nSingle Males: ");<br /> printPersons(singleMale.meetCriteria(persons)); System.out.println("\nSingle Or Females: ");<br /> printPersons(singleOrFemale.meetCriteria(persons));<br /> } public static void printPersons(List<Person> persons){<br /> for (Person person : persons) {<br /> System.out.println("Person : [ Name : " + person.getName()<br /> +", Gender : " + person.getGender()<br /> +", Marital Status : " + person.getMaritalStatus()<br /> +" ]");<br /> }<br /> }<br /> }
