轉(zhuǎn):http://www.runoob.com/design-pattern/filter-pattern.html
過濾器模式
過濾器模式(Filter Pattern)或標(biāo)準(zhǔn)模式(Criteria Pattern)是一種設(shè)計(jì)模式,這種模式允許開發(fā)人員使用不同的標(biāo)準(zhǔn)來過濾一組對(duì)象,通過邏輯運(yùn)算以解耦的方式把它們連接起來尸疆。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式搬设,它結(jié)合多個(gè)標(biāo)準(zhǔn)來獲得單一標(biāo)準(zhǔn)。
實(shí)現(xiàn)
我們將創(chuàng)建一個(gè)?Person?對(duì)象排拷、Criteria?接口和實(shí)現(xiàn)了該接口的實(shí)體類,來過濾?Person?對(duì)象的列表。CriteriaPatternDemo倔幼,我們的演示類使用?Criteria?對(duì)象,基于各種標(biāo)準(zhǔn)和它們的結(jié)合來過濾?Person?對(duì)象的列表爽待。
步驟 1
創(chuàng)建一個(gè)類损同,在該類上應(yīng)用標(biāo)準(zhǔn)。
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
為標(biāo)準(zhǔn)(Criteria)創(chuàng)建一個(gè)接口堕伪。
Criteria.java
import java.util.List;
public interface Criteria {? public List<Person> meetCriteria(List<Person> persons);}
步驟 3
創(chuàng)建實(shí)現(xiàn)了?Criteria?接口的實(shí)體類揖庄。
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
使用不同的標(biāo)準(zhǔn)(Criteria)和它們的結(jié)合來過濾?Person?對(duì)象的列表。
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
執(zhí)行程序欠雌,輸出結(jié)果:
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 ]