目录
过滤器模式
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是⼀种设计模式,这种模式允许开发⼈员使⽤不同的标准来过滤⼀组对象,通过逻辑运算以解耦的⽅式把它们连接起来。这种类型的设计模式属于结构型模式,它结合 多个标准来获得单⼀标准。
实现
我们将创建⼀个Person对象、Criteria接⼝和实现了该接⼝的实体类,来过滤Person对象的列表。 CriteriaPatternDemo类使⽤Criteria对象,基于各种标准和它们的结合来过滤Person对象的列表。
具体实现步骤
1.创建⼀个Java项⽬。
2.创建⼀个Person类,在该类上应⽤标准。
package com.设计模式.过滤器模式;
public class Person {
private String name;
private String gender;
//婚姻状态:single单身 marital已婚
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;
}
}
3.为标准创建⼀个接⼝Criteria。
package com.设计模式.过滤器模式;
import java.util.List;
/*
* 过滤器接口(标准接口)
* */
public interface Criteria {
/*
* 实现符合指定的过滤条件的方法,需要将对应的Person对象以参数的形式进行传递
* */
/*
* 方法表示一个过滤的方法
* person被过滤的对象
* 满足条件的对象的集合
* */
List<Person> meetCriteria(List<Person> persons);
}
4.创建实现了Criteria接⼝的实体类CriteriaMale。
package com.设计模式.过滤器模式;
import java.util.ArrayList;
import java.util.List;
/*
* 男性过滤器对应的类
* */
public class CriteriaMale implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> malePerson = new ArrayList<>();
for (Person p : persons) {
if (p.getGender().equalsIgnoreCase("male")){
malePerson.add(p);
}
}
return malePerson;
}
}
5.创建实现了Criteria接⼝的实体类CriteriaFemale。
package com.设计模式.过滤器模式;
import java.util.ArrayList;
import java.util.List;
/*
* 女性过滤器对应的类
* */
public class CriteriaFemale implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> femalePerson = new ArrayList<>();
for (Person p : persons) {
if (p.getGender().equalsIgnoreCase("female")){
femalePerson.add(p);
}
}
return femalePerson;
}
}
6.创建实现了Criteria接⼝的实体类CriteriaSingle。
package com.设计模式.过滤器模式;
import java.util.ArrayList;
import java.util.List;
public class CriteriaSingle implements Criteria{
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> singlePerson = new ArrayList<>();
for (Person p : persons) {
if (p.getMaritalStatus().equalsIgnoreCase("single")){
singlePerson.add(p);
}
}
return singlePerson;
}
}
7.创建实现了Criteria接⼝的实体类AndCriteria。
package com.设计模式.过滤器模式;
import java.util.ArrayList;
import java.util.List;
/*
* 已婚状态
* */
public class AddCriteria implements Criteria{
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> maritalPerson = new ArrayList<>();
for (Person p : persons) {
if (p.getMaritalStatus().equalsIgnoreCase("marital")){
maritalPerson.add(p);
}
}
return maritalPerson;
}
}
8.创建实现了Criteria接⼝的实体类OrCriteria。
package com.设计模式.过滤器模式;
import java.util.ArrayList;
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> firstPersons = new ArrayList<>();
List<Person> secondPersons = new ArrayList<>();
firstPersons = criteria.meetCriteria(persons);
secondPersons = otherCriteria.meetCriteria(persons);
for (Person person : secondPersons) {
if (!firstPersons.contains(person)){
firstPersons.add(person);
}
}
return firstPersons;
}
}
9.使⽤不同的标准(Criteria)和它们的结合来过滤Person对象的列表。
package com.设计模式.过滤器模式;
import java.util.ArrayList;
import java.util.List;
public class FilterPatternDemo {
public static void main(String[] args) {
//构建一个List集合,在这个集合中保存不同person信息的对象
List<Person> personList = new ArrayList<>();
Person person1 = new Person("赵","male","single");
Person person2 = new Person("钱","female","single");
Person person3 = new Person("孙","male","marital");
Person person4 = new Person("李","male","single");
Person person5 = new Person("王","female","marital");
Person person6 = new Person("刘","female","single");
Person person7 = new Person("张","male","marital");
personList.add(person1);
personList.add(person2);
personList.add(person3);
personList.add(person4);
personList.add(person5);
personList.add(person6);
personList.add(person7);
//创建一个过滤器对象,(male筛选出来)
Criteria male = new CriteriaMale();
List<Person> males = male.meetCriteria(personList);
for (Person p :males) {
System.out.println(p.getName()+" "+p.getGender()+" "+p.getMaritalStatus());
}
System.out.println("----------------------");
//筛选marital
Criteria marital = new AddCriteria();
List<Person> maritals = marital.meetCriteria(personList);
for (Person p : maritals) {
System.out.println(p.getName()+" "+p.getGender()+" "+p.getMaritalStatus());
}
System.out.println("----------------------");
//筛选male,marital
Criteria maleMarital = new OrCriteria(male,marital);
List<Person> maleMaritals = maleMarital.meetCriteria(personList);
for (Person p :maleMaritals) {
System.out.println(p.getName()+" "+p.getGender()+" "+p.getMaritalStatus());
}
}
}
10.执⾏程序,输出结果。