一、介绍
过滤器模式,顾名思义,从名字上就可以看出主要用于过滤对象,实现起来也很简单!
从设计的角度看,过滤器模式涉及到三个角色:
- 抽象过滤器角色:主要定义过滤器的行为;
- 具体滤器角色:实现或者继承抽象过滤器,完善具体算法;
- 客户端:客户类提出使用具体类的请求;
话不多说,代码直接撸起来~
二、示例
下面,我们以班级同学为例,过滤出满足要求的同学,实现过程如下!
先创建一个数据实体类Person
,如下:
/** * 数据实体类 */ public class Person { private String name;//姓名 private String gender;//性别 private int age;//年龄 public String getName() { return name; } //...省略set/get public Person(String name, String gender, int age) { this.name = name; this.gender = gender; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", gender='" + gender + '\'' + ", age=" + age + '}'; } }
然后,创建一个过滤器标准接口Filter
,代码如下:
/** * 过滤器接口 */ public interface Filter { /** * 过滤操作 * @param personList * @return */ List<Person> filterOperate(List<Person> personList); }
接着,创建过滤器具体实现类AgeFilter
、GenderFilter
,代码如下:
/** * 过滤已满足18岁的同学 */ public class AgeFilter implements Filter { @Override public List<Person> filterOperate(List<Person> personList) { List<Person> targetList = new ArrayList<>(); for (Person person : personList) { if(person.getAge() >= 18){ targetList.add(person); } } return targetList; } }
/** * 过滤出性别为男的同学 */ public class GenderFilter implements Filter { @Override public List<Person> filterOperate(List<Person> personList) { List<Person> targetList = new ArrayList<>(); for (Person person : personList) { if("男".equals(person.getGender())){ targetList.add(person); } } return targetList; } }
最后,编写一个测试类如下:
public class FilterClient { public static void main(String[] args) { List<Person> personList = new ArrayList<>(); personList.add(new Person("程咬金","男",36)); personList.add(new Person("露娜","女",16)); personList.add(new Person("伽啰","女",18)); personList.add(new Person("苏烈","男",40)); personList.add(new Person("武则天","女",24)); personList.add(new Person("韩信","男",16)); //过程出年龄已满18周岁的同学 Filter ageFilter = new AgeFilter(); personList = ageFilter.filterOperate(personList); System.out.println(personList); System.out.println("========分隔符======="); //过滤出性别为男的同学 Filter genderFilter = new GenderFilter(); personList = genderFilter.filterOperate(personList); System.out.println(personList); } }
输出结果:
[Person{name='程咬金', gender='男', age=36}, Person{name='伽啰', gender='女', age=18}, Person{name='苏烈', gender='男', age=40}, Person{name='武则天', gender='女', age=24}] ========分隔符======= [Person{name='程咬金', gender='男', age=36}, Person{name='苏烈', gender='男', age=40}]
当然,还可以按照姓名过滤,只需要写一个过滤器实现类,然后在客户端加入过滤即可!
三、应用
过滤器模式的应用,当属我们最熟悉的 JavaWeb 工程中的Filter
,如果我们想自定义一个过滤器,只需要实现Filter
即可!例如创建一个允许跨域的Filter
过滤器,如下:
/** * Servlet Filter implementation class CrossOriginFilter */ public class CrossOriginFilter implements Filter { private boolean isCross = false; /** * Default constructor. */ public CrossOriginFilter() { // TODO Auto-generated constructor stub } /** * @see Filter#destroy() */ public void destroy() { // TODO Auto-generated method stub } /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub // place your code here if(isCross){ HttpServletRequest httpServletRequest = (HttpServletRequest)request; HttpServletResponse httpServletResponse = (HttpServletResponse)response; System.out.println("拦截请求: "+httpServletRequest.getServletPath()); // httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); httpServletResponse.setHeader("Access-Control-Allow-Origin", httpServletRequest.getHeader("Origin")); httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true"); httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); httpServletResponse.setHeader("Access-Control-Max-Age", "3600"); httpServletResponse.setHeader("Access-Control-Allow-Headers", "x-requested-with"); } // pass the request along the filter chain chain.doFilter(request, response); } /** * @see Filter#init(FilterConfig) */ public void init(FilterConfig fConfig) throws ServletException { // TODO Auto-generated method stub } }
四、总结
过滤器模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来,操作也比较简单,在实际开发中,使用非常广泛。
五、参考
1、菜鸟教程 - 过滤器模式