过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式
这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
应用场景:
比如消息过滤,日志过滤。
特点:
清除不需要的内容
UML图
下面是类实现
定义过滤的对象
一个普通的类
/** * 这是要过滤的对象 */ public class Person { // 这就是一些普通属性 private String name; private String gender; 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 String getGender() { return gender; } public String getMaritalStatus() { return maritalStatus; } @Override public String toString() { return "Person [name=" + name + ", gender=" + gender + ", maritalStatus=" + maritalStatus + "]"; } }
过滤器接口定义
/** * 这个过滤器的标准接口 * * @author admin * */ public interface Criteria { //加入要过滤的对象 public List<Person> meetCriteria(List<Person> persons); }
实现着这个过滤器接口
//具体过滤类 public class CriteriaFemale implements Criteria { @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> femalePersons = new ArrayList<Person>(); for (Person person : persons) { if (person.getGender().equalsIgnoreCase("FEMALE")) { femalePersons.add(person); } } return femalePersons; } }
另一类型过滤器
/** * 过滤的具体实现类 * @author admin * */ public class CriteriaMale implements Criteria { @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> malePersons = new ArrayList<Person>(); for (Person person : persons) { if (person.getGender().equalsIgnoreCase("MALE")) { malePersons.add(person); } } return malePersons; } }
测试类
public class Main { public static void main(String[] args) { // 将内容加入进去 List<Person> persons = new ArrayList<Person>(); persons.add(new Person("Robert", "Male", "Single")); persons.add(new Person("John", "Male", "Married")); persons.add(new Person("Laura", "Female", "Married")); // 初始化 2种过滤类(其实就是设置不同过滤规则) Criteria male = new CriteriaMale(); Criteria female = new CriteriaFemale(); //传入过滤器中 System.out.println("Males: "); System.out.println(male.meetCriteria(persons).toString()); System.out.println("\nFemales: "); System.out.println(female.meetCriteria(persons).toString()); } }
结果:
总结
创建过滤接口,实现接口。要使用那种过滤规则就初始化那种对象,然后将要过滤对象放入其中就可以了。
面向接口编程,将对象过滤,接口不依赖对象;对象无入侵,每次只需要增加规则就行了,不用修改过滤对象类。
实例:https://www.cnblogs.com/huangxincheng/p/6415393.html
参考来源:http://www.runoob.com/design-pattern/filter-pattern.html