过滤器模式,你的心里还有没有印象,在哪里用到过?
过滤器模式(filter pattern),允许开发人员使用不同的标准来过滤一个对象,通过逻辑运算以解耦的方式把它们连接起来,属于构建型模式,又称标准模式(criteria pattern)。
业务场景:需要进行条件过滤的时候。
UML类图
1. 创建应用标准的类;
/**
* 1. 创建一个类,在该类上应用该标准
* @author 程就人生
* @Date
*/
public class Person {
public Person(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
private String name;
private String sex;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
2. 为标准创建接口;
import java.util.List;
/**
* 2.为标准创建一个接口
* @author 程就人生
* @Date
*/
public interface ICriteria {
public List<Person> filter(List<Person> personList);
}
3. 多个标准接口实现类;
import java.util.List;
/**
* 3.标准接口实现类
* @author 程就人生
* @Date
*/
public class AddCriteria implements ICriteria {
private ICriteria criteria1;
private ICriteria criteria2;
public AddCriteria(ICriteria criteria1, ICriteria criteria2) {
this.criteria1 = criteria1;
this.criteria2 = criteria2;
}
@Override
public List<Person> filter(List<Person> personList) {
List<Person> criteria = criteria1.filter(personList);
return criteria2.filter(criteria);
}
}
import java.util.List;
import java.util.stream.Collectors;
/**
* 3.标准接口实现类
* @author 程就人生
* @Date
*/
public class AgeCriteria implements ICriteria{
@Override
public List<Person> filter(List<Person> personList) {
return personList.stream().filter(person->person.getAge() >=18 ).collect(Collectors.toList());
}
}
import java.util.List;
import java.util.stream.Collectors;
/**
* 3.标准接口实现类
* @author 程就人生
* @Date
*/
public class FemaleCriteria implements ICriteria{
@Override
public List<Person> filter(List<Person> personList) {
return personList.stream().filter(person->person.getSex().equals("女")).collect(Collectors.toList());
}
}
import java.util.List;
import java.util.stream.Collectors;
/**
* 3.标准接口实现类
* @author 程就人生
* @Date
*/
public class MaleCriteria implements ICriteria{
@Override
public List<Person> filter(List<Person> personList) {
return personList.stream().filter(person->person.getSex().equals("男")).collect(Collectors.toList());
}
}
import java.util.List;
/**
* 3.标准接口实现类
* @author 程就人生
* @Date
*/
public class OrCriteria implements ICriteria{
private ICriteria criteria1;
private ICriteria criteria2;
public OrCriteria(ICriteria criteria1, ICriteria criteria2) {
this.criteria1 = criteria1;
this.criteria2 = criteria2;
}
@Override
public List<Person> filter(List<Person> personList) {
List<Person> firstCriteriaItems = criteria1.filter(personList);
List<Person> otherCriteriaItems = criteria2.filter(personList);
for (Person person : otherCriteriaItems) {
if(!firstCriteriaItems.contains(person)){
firstCriteriaItems.add(person);
}
}
return firstCriteriaItems;
}
}
4. 简单应用;
public static void main(String[] argo){
List<Person> personList = new ArrayList<Person>();
personList.add(new Person("张三", "女", 20));
personList.add(new Person("老张", "女", 40));
personList.add(new Person("小明", "男", 15));
personList.add(new Person("李四", "男", 30));
personList.add(new Person("王五", "男", 35));
personList.add(new Person("王麻子", "未知", 45));
// 女性
ICriteria femaleCriteria = new FemaleCriteria();
List<Person> list = femaleCriteria.filter(personList);
System.out.println("女性为:" + list);
// 成年男性
ICriteria maleCriteria = new MaleCriteria();
ICriteria ageCriteria = new AgeCriteria();
ICriteria addCriteria = new AddCriteria(maleCriteria, ageCriteria);
list = addCriteria.filter(personList);
System.out.println("成年男性:" + list);
// 男性或者女性
ICriteria orCriteria = new OrCriteria(maleCriteria, femaleCriteria);
list = orCriteria.filter(personList);
System.out.println("男性或者女性为:" + list);
}
这段代码的意思是:有一队人,进行条件筛选,第一次筛选女性,第二次筛选成年男性,第三次筛选已知性别的人,不符合条件的不进入选中队列。
运行结果:
女性为:[Person [name=张三, sex=女, age=20], Person [name=老张, sex=女, age=40]]
成年男性:[Person [name=李四, sex=男, age=30], Person [name=王五, sex=男, age=35]]
男性或者女性为:[Person [name=小明, sex=男, age=15], Person [name=李四, sex=男, age=30], Person [name=王五, sex=男, age=35], Person [name=张三, sex=女, age=20], Person [name=老张, sex=女, age=40]]
网友评论