赞
踩
过滤器模式(Filter Pattern)
是一种结构型模式。过滤器模式提供了多种过滤接口,你可以将这些过滤接口进行组合来达到你想要的过滤效果。
简单理解:有一个饮水机的滤芯(接口),它有大小,只有符合大小的过滤器才能装入,现在有木炭过滤器(实现类)、细菌过滤器(实现类)、杂质过滤器(实现类)、异味吸附器(实现类)这几种过滤器,它们都和滤芯的大小一样。所以,你可以随意将这些过滤器进行组合来达到不同的过滤效果。
类图:
Criteria接口
是所以过滤器类都必须实现的接口,其中有一个方法filtered()方法,这个方法中的过滤规则和过滤逻辑由实现了这个接口的类来实现。
package filterPattern;
import java.util.List;
public interface Criteria {
public List<Person> filtered(List<Person> personList);
}
Adult类
一个过滤器类,实现了Criteria接口,将所有的age小于18的Person对象过滤掉。
package filterPattern; import java.util.ArrayList; import java.util.List; public class Adult implements Criteria { @Override public List<Person> filtered(List<Person> personList) { List<Person> temList = new ArrayList<Person>(); for (Person person : personList) { if (person.getAge() >= 18) { temList.add(person); } } return temList; } }
FirstNameIsLi类
这个过滤器实现了Criteria接口,将名字的姓氏不为Li的Person对象过滤掉。
package filterPattern; import java.util.ArrayList; import java.util.List; public class FirstNameIsLi implements Criteria { @Override public List<Person> filtered(List<Person> personList) { List<Person> temList = new ArrayList<Person>(); for (Person person : personList) { if(person.getName().split(" ")[0].equals("Li")) { temList.add(person); } } return temList; } }
AndFilter类
这个过滤器类可以实现两个过滤器过滤效果的且功能,只要两个过滤器其中的一个可以过滤这个对象,那么这个对象将会被过滤。
package filterPattern; import java.util.List; public class AndFilter implements Criteria { private Criteria criteria1; private Criteria criteria2; public AndFilter(Criteria criteria1, Criteria criteria2) { this.criteria1 = criteria1; this.criteria2 = criteria2; } @Override public List<Person> filtered(List<Person> personList) { personList = criteria1.filtered(personList); return criteria2.filtered(personList); } }
OrFilter过滤器类
这个过滤器类可以将两个过滤器的过滤功能取或,只要两个过滤器不能都过滤,那么就不过滤。
package filterPattern; import java.util.ArrayList; import java.util.List; public class OrFilter implements Criteria { private Criteria criteria1; private Criteria criteria2; public OrFilter(Criteria criteria1, Criteria criteria2) { this.criteria1 = criteria1; this.criteria2 = criteria2; } @Override public List<Person> filtered(List<Person> personList) { List<Person> temList = new ArrayList<Person>(); List<Person> personFilteredList = criteria1.filtered(personList); for (Person person : personFilteredList) { if(!personList.contains(person)) { temList.add(person); } } personFilteredList = criteria2.filtered(personList); for (Person person : personFilteredList) { if(!personList.contains(person)) { temList.add(person); } } return temList; } }
Person类
装入ArrayList中的对象
package filterPattern; public class Person { private String name; private Integer age; private Integer height; private Integer weight; public Person() { } public Person(String name, Integer age, Integer height, Integer weight) { super(); this.name = name; this.age = age; this.height = height; this.weight = weight; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Integer getHeight() { return height; } public void setHeight(Integer height) { this.height = height; } public Integer getWeight() { return weight; } public void setWeight(Integer weight) { this.weight = weight; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", height=" + height + ", weight=" + weight + "]"; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } Person person = (Person) obj; if (person.getName() == null | getName() == null) { return false; } else { return getName().equalsIgnoreCase(person.getName()) && person.getAge() == age && person.getHeight() == height && person.getWeight() == weight; } } }
测试类
创建一个ArrayList,在其中放入Person对象,再创建几个过滤类来过滤这个ArrayList,看看结果和我们预料的过滤结果是否一样。
package filterPattern; import java.util.ArrayList; import java.util.List; import org.junit.Test; public class TestJ { @Test public void test1() { //创建一个用来存储Person的ArrayList List<Person> personList = new ArrayList<Person>(); //向数组中添加Person对象 personList.add(new Person("Li hong", 34, 170, 57)); personList.add(new Person("Sun lie", 23, 176, 60)); personList.add(new Person("Liu xiao", 13, 167, 65)); personList.add(new Person("Li ming", 12, 182, 67)); //创建一个成年人过滤器对象 Criteria adultFiltered = new Adult(); //打印过滤后的ArrayList System.out.println(adultFiltered.filtered(personList).toString()); //创建一个姓氏为Li的过滤器 Criteria firstNameIsLi = new FirstNameIsLi(); //打印过滤后的ArrayList System.out.println(firstNameIsLi.filtered(personList).toString()); } }
运行结果:
[Person [name=Li hong, age=34, height=170, weight=57], Person [name=Sun lie, age=23, height=176, weight=60]]
[Person [name=Li hong, age=34, height=170, weight=57], Person [name=Li ming, age=12, height=182, weight=67]]
过滤器模式就是定义一个过滤接口,所有的过滤类都来实现这个接口,并实现其中的过滤逻辑。然后,将这些过滤类组合起来达到我们想要的过滤效果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。