您的位置:首页 > 其它

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

2016-04-23 15:27 387 查看
筛选模式,也叫做条件模式。这种设计模式可以让开发人员通过使用不同的条件在一个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}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: