public class Person {
/**
* 名字
*/
private String name;
/**
* 性别
*/
private String sex;
/**
* 婚姻状态
*/
private String maritalStatus;
public Person(String name, String sex, String maritalStatus) {
this.name = name;
this.sex = sex;
this.maritalStatus = maritalStatus;
}
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public String getMaritalStatus() {
return maritalStatus;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", maritalStatus='" + maritalStatus + '\'' +
'}';
}
}
/**
* 标准,过滤条件
*/
public interface Criteria {
public List<Person> meetCriteria(List<Person> persons);
}
/**
* 男性过滤条件
*/
public class CriteriaMale implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> malePersons=new ArrayList<>();
for (Person person:persons){
if (person.getSex().equalsIgnoreCase("male")){
malePersons.add(person);
}
}
return malePersons;
}
}
/**
* 女性过滤类
*/
public class CriteriaFemale implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> femaleCriteria=new ArrayList<>();
for (Person person:persons){
if (person.getSex().equalsIgnoreCase("female")){
femaleCriteria.add(person);
}
}
return femaleCriteria;
}
}
/**
* 与过滤条件
*/
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);
}
}
/**
* 并过滤条件
*/
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> secondCriteriaItems=otherCriteria.meetCriteria(persons);
for (Person person:secondCriteriaItems){
if (!firstCriteriaItems.contains(person)){
firstCriteriaItems.add(person);
}
}
return firstCriteriaItems;
}
}
测试:
/**
* 使用不同的标准(Criteria)和它们的结合来过滤 Person 对象的列表。
*/
public class CriteriaPatternDemo {
public static void main(String[] args) {
List<Person> persons=new ArrayList<>();
persons.add(new Person("aa","male","single"));
persons.add(new Person("bb","female","married"));
persons.add(new Person("cc","male","single"));
persons.add(new Person("dd","male","married"));
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("male:");
System.out.println(male.meetCriteria(persons));
System.out.println("\nFemales:");
System.out.println(female.meetCriteria(persons));
System.out.println("\nSingle Males:");
System.out.println(singleMale.meetCriteria(persons));
System.out.println("\nSingle Or Females:");
System.out.println(singleOrFemale.meetCriteria(persons));
}
}
male:
[Person{name='aa', sex='male', maritalStatus='single'}, Person{name='cc', sex='male', maritalStatus='single'}, Person{name='dd', sex='male', maritalStatus='married'}]
Females:
[Person{name='bb', sex='female', maritalStatus='married'}]
Single Males:
[]
Single Or Females:
[Person{name='bb', sex='female', maritalStatus='married'}]