07@设计模式 -(05) 筛选模式

来源:互联网 发布:积分入学社保怎么算法 编辑:程序博客网 时间:2024/04/30 21:06

筛选模式,也叫做条件模式。这种设计模式可以让开发人员通过使用不同的条件在一个Set集合的对象中筛选自己想要的,并通过逻辑操作方法以解耦的方式将他们串联起来。这种设计模式属于结构型设计模式(structural pattern),本质上就是将多个条件组合成一个条件。
具体实现
我们将创建一个叫Person的类,一个叫Criteria的接口和具体的实现类以实现这个接口,实现类在一组Person对象中去筛选。最后在CriteriaPatternDemo类中编写调用代码:使用Criteria对象根据多种条件在一组Person对象实例中进行筛选,或者根据这些条件的组合进行筛选。
这里写图片描述
第一步:创建一个类,这个类所生成的对象将被条件说筛选
Person.java

package com.patterns.filter;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 void setName(String name) {        this.name = name;    }    public String getGender() {        return gender;    }    public void setGender(String gender) {        this.gender = gender;    }    public String getMaritalStatus() {        return maritalStatus;    }    public void setMaritalStatus(String maritalStatus) {        this.maritalStatus = maritalStatus;    }    @Override    public String toString() {        return "Person{" + "name=" + name + ", gender=" + gender + ", maritalStatus=" + maritalStatus + '}';    }}

第二步:创建一个叫做Criteria的接口

Criteria.java

package com.patterns.filter;import java.util.List;public interface Criteria {    public List<Person> meetCriteria(List<Person> persons);}

第三步:创建实现类,实现Criteria接口

CriteriaMale.java

package com.patterns.filter;import java.util.ArrayList;import java.util.List;public class CriteriaMale implements Criteria{    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

package com.patterns.filter;import java.util.ArrayList;import java.util.List;public class CriteriaFemale implements Criteria{    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

package com.patterns.filter;import java.util.ArrayList;import java.util.List;public class CriteriaSingle implements Criteria{    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

package com.patterns.filter;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

package com.patterns.filter;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;    }    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;    }}

第四步:使用不同的条件和不同条件的叠加来筛选出想要的对象

CriteriaPatternDemo.java

package com.patterns.filter;import java.util.ArrayList;import java.util.List;public class CriteriaPatternDemo {    public static void printPersons(List<Person> persons)    {        for(Person person:persons)        {            System.out.println(person.toString());        }    }    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));    }}

第五步:验证输出

Males: Person{name=Robert, gender=Male, maritalStatus=Single}Person{name=John, gender=Male, maritalStatus=Married}Person{name=Mike, gender=Male, maritalStatus=Single}Person{name=Bobby, gender=Male, maritalStatus=Single}Females: Person{name=Laura, gender=Female, maritalStatus=Married}Person{name=Diana, gender=Female, maritalStatus=Single}Single Males: Person{name=Robert, gender=Male, maritalStatus=Single}Person{name=Mike, gender=Male, maritalStatus=Single}Person{name=Bobby, gender=Male, maritalStatus=Single}Single Or Females: Person{name=Robert, gender=Male, maritalStatus=Single}Person{name=Diana, gender=Female, maritalStatus=Single}Person{name=Mike, gender=Male, maritalStatus=Single}Person{name=Bobby, gender=Male, maritalStatus=Single}Person{name=Laura, gender=Female, maritalStatus=Married}
0 0
原创粉丝点击