6.10. Filter mode

发布时间 : 2025-10-25 13:34:19 UTC      

Page Views: 9 views

Filter pattern (Filter Pattern) or standard pattern (Criteria Pattern) is a design pattern that allows developers to filter a set of objects using different standards and connect them in a decoupled manner through logical operations. This type of design pattern belongs to structural pattern, which combines multiple standards to obtain a single standard.

6.10.1. Realize

We will create a Person Object, Criteria Interface and the entity class that implements the interface, to filter Person A list of objects. CriteriaPatternDemo Class usage Criteria Object that is filtered based on various standards and their combination Person A list of objects.

过滤器模式的 UML 图

6.10.2. Step 1

Create a class and apply standards to it.

Person.java

publicclassPerson{privateStringname;privateStringgender;privateStringmaritalStatus;publicPerson(Stringname,Stringgender,StringmaritalStatus){this.name=name;this.gender=gender;this.maritalStatus=maritalStatus;}publicStringgetName(){returnname;}publicStringgetGender(){returngender;}publicStringgetMaritalStatus(){returnmaritalStatus;}} 

6.10.3. Step 2

Create an interface for the standard (Criteria).

Criteria.java

importjava.util.List;publicinterfaceCriteria{publicList<Person>meetCriteria(List<Person>persons);} 

6.10.4. Step 3

Create and implement the Criteria The entity class of the interface.

CriteriaMale.java

importjava.util.ArrayList;importjava.util.List;publicclassCriteriaMaleimplementsCriteria{@OverridepublicList<Person>meetCriteria(List<Person>persons){List<Person>malePersons=newArrayList<Person>();for(Personperson:persons){if(person.getGender().equalsIgnoreCase("MALE")){malePersons.add(person);}}returnmalePersons;}} 

CriteriaFemale.java

importjava.util.ArrayList;importjava.util.List;publicclassCriteriaFemaleimplementsCriteria{@OverridepublicList<Person>meetCriteria(List<Person>persons){List<Person>femalePersons=newArrayList<Person>();for(Personperson:persons){if(person.getGender().equalsIgnoreCase("FEMALE")){femalePersons.add(person);}}returnfemalePersons;}} 

CriteriaSingle.java

importjava.util.ArrayList;importjava.util.List;publicclassCriteriaSingleimplementsCriteria{@OverridepublicList<Person>meetCriteria(List<Person>persons){List<Person>singlePersons=newArrayList<Person>();for(Personperson:persons){if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){singlePersons.add(person);}}returnsinglePersons;}} 

AndCriteria.java

importjava.util.List;publicclassAndCriteriaimplementsCriteria{privateCriteriacriteria;privateCriteriaotherCriteria;publicAndCriteria(Criteriacriteria,CriteriaotherCriteria){this.criteria=criteria;this.otherCriteria=otherCriteria;}@OverridepublicList<Person>meetCriteria(List<Person>persons){List<Person>firstCriteriaPersons=criteria.meetCriteria(persons);returnotherCriteria.meetCriteria(firstCriteriaPersons);}} 

OrCriteria.java

importjava.util.List;publicclassOrCriteriaimplementsCriteria{privateCriteriacriteria;privateCriteriaotherCriteria;publicOrCriteria(Criteriacriteria,CriteriaotherCriteria){this.criteria=criteria;this.otherCriteria=otherCriteria;}@OverridepublicListmeetCriteria(Listpersons){ListfirstCriteriaItems=criteria.meetCriteria(persons);ListotherCriteriaItems=otherCriteria.meetCriteria(persons);for(Personperson:otherCriteriaItems){if(!firstCriteriaItems.contains(person)){firstCriteriaItems.add(person);}}returnfirstCriteriaItems;}}      

6.10.5. Step 4

Use different standards (Criteria) and their combination to filter Person A list of objects.

CriteriaPatternDemo.java

importjava.util.ArrayList;importjava.util.List;publicclassCriteriaPatternDemo{publicstaticvoidmain(String[]args){List<Person>persons=newArrayList<Person>();persons.add(newPerson("Robert","Male","Single"));persons.add(newPerson("John","Male","Married"));persons.add(newPerson("Laura","Female","Married"));persons.add(newPerson("Diana","Female","Single"));persons.add(newPerson("Mike","Male","Single"));persons.add(newPerson("Bobby","Male","Single"));Criteriamale=newCriteriaMale();Criteriafemale=newCriteriaFemale();Criteriasingle=newCriteriaSingle();CriteriasingleMale=newAndCriteria(single,male);CriteriasingleOrFemale=newOrCriteria(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));}publicstaticvoidprintPersons(Listpersons){for(Personperson:persons){System.out.println("Person : [ Name :"+person.getName()+", Gender :"+person.getGender()+", Marital Status :"+person.getMaritalStatus()+"]");}}}      

6.10.6. Step 5

Execute the program and output the result:

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 ] 
《地理信息系统原理、技术与方法》  97

最近几年来,地理信息系统无论是在理论上还是应用上都处在一个飞速发展的阶段。 GIS被应用于多个领域的建模和决策支持,如城市管理、区划、环境整治等等,地理信息成为信息时代重要的组成部分之一; “数字地球”概念的提出,更进一步推动了作为其技术支撑的GIS的发展。 与此同时,一些学者致力于相关的理论研究,如空间感知、空间数据误差、空间关系的形式化等等。 这恰好说明了地理信息系统作为应用技术和学科的两个方面,并且这两个方面构成了相互促进的发展过程。