Java中的过滤器模式(Filter Design Pattern)也称为标准模式(Criteria Pattern),它用于通过一系列条件来筛选对象的集合。过滤器模式允许将多个过滤条件组合在一起,以便根据不同的需求过滤对象。
在过滤器模式中,通常包含以下主要角色:
过滤器接口(Criteria):定义用于筛选对象的方法。
具体过滤器(ConcreteCriteria):实现过滤器接口,根据不同的条件对对象进行筛选。
过滤器管理器(CriteriaFilter):包含多个过滤器对象,并根据不同的条件组合它们,对对象进行筛选。
客户端(Client):使用过滤器管理器来过滤对象集合,并获取满足条件的对象。
下面是一个简单的示例:
首先,我们创建一个过滤器接口(Criteria):
import java.util.List;
public interface Criteria {
List
}
然后,我们创建一个具体过滤器(ConcreteCriteria),实现过滤器接口,并根据不同的条件对对象进行筛选:
import java.util.ArrayList;
import java.util.List;
public class MaleCriteria implements Criteria {
@Override
public List
List
for (Person person : persons) {
if (person.getGender().equalsIgnoreCase("MALE")) {
malePersons.add(person);
}
}
return malePersons;
}
}
public class FemaleCriteria implements Criteria {
@Override
public List
List
for (Person person : persons) {
if (person.getGender().equalsIgnoreCase("FEMALE")) {
femalePersons.add(person);
}
}
return femalePersons;
}
}
接下来,我们创建一个过滤器管理器(CriteriaFilter),包含多个过滤器对象,并根据不同的条件组合它们,对对象进行筛选:
import java.util.List;
public class CriteriaFilter implements Criteria {
private Criteria criteria;
private Criteria otherCriteria;
public CriteriaFilter(Criteria criteria, Criteria otherCriteria) {
this.criteria = criteria;
this.otherCriteria = otherCriteria;
}
@Override
public List
List
return otherCriteria.meetCriteria(firstCriteriaPersons);
}
}
现在,我们可以使用过滤器模式来过滤对象集合。首先,创建一个列表对象,然后使用具体过滤器对该列表进行筛选,并获取满足条件的对象:
public class Main {
public static void main(String[] args) {
List
persons.add(new Person("Alice", "FEMALE"));
persons.add(new Person("Bob", "MALE"));
persons.add(new Person("Charlie", "MALE"));
persons.add(new Person("Diana", "FEMALE"));
Criteria maleCriteria = new MaleCriteria();
Criteria femaleCriteria = new FemaleCriteria();
Criteria maleAndFemaleCriteria = new CriteriaFilter(maleCriteria, femaleCriteria);
System.out.println("Males:");
printPersons(maleCriteria.meetCriteria(persons));
System.out.println("\nFemales:");
printPersons(femaleCriteria.meetCriteria(persons));
System.out.println("\nMales and Females:");
printPersons(maleAndFemaleCriteria.meetCriteria(persons));
}
private static void printPersons(List
for (Person person : persons) {
System.out.println("Name: " + person.getName() + ", Gender: " + person.getGender());
}
}
}
输出结果:
Males:
Name: Bob, Gender: MALE
Name: Charlie, Gender: MALE
Females:
Name: Alice, Gender: FEMALE
Name: Diana, Gender: FEMALE
Males and Females:
这个例子展示了过滤器模式的实现方式。通过创建过滤器接口、具体过滤器和过滤器管理器,并在过滤器管理器中根据不同的条件组合过滤器,可以实现对对象集合的灵活筛选。过滤器模式可以让客户端根据不同的条件筛选对象,而无需修改对象类本身,从而提高了代码的可维护性和灵活性。