设计模式之过滤器模式

Posted JAVA 开发微指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之过滤器模式相关的知识,希望对你有一定的参考价值。

        博主上次分析完cas客户端源码后,发现了其实就是一个过滤器模式,对请求以及session一直做校验,每个过滤器都有各自的工作,互不影响耦合性低,所以就模仿其源码,做了一次过滤器模式的学习,图示如下

       其实过滤器整个类可以不用,只不过在jetty中,过滤器整合类不知有过滤器还有其他属性,比如config配置等。如下:参考即可

        好了,我们来看一下过滤器模式,一个过滤器接口定义方法,多个实现类去实现具体操作过滤,一个整合类增加一个过滤器,一个过滤器链表去实现以节点类型,依次进行过滤


        该接口进行定义方法:

import java.io.IOException;import java.util.List;
/** * @title: DemoFilter * @Author junyu * @Date: 2020/7/18 9:23 * @Version 1.0 */public interface DemoFilter{
void doFilter(List list, DemoFilterChain demoFilterChain);}

        多个实现类:

import java.util.List;
/** * @title: AFilterImpl * @Author junyu * @Date: 2020/7/18 11:58 * @Version 1.0 */public class AFilterImpl implements DemoFilter{
@Override public void doFilter(List list, DemoFilterChain demoFilterChain) { System.out.println("AFilterImpl is beginning"); if (list.isEmpty()) { System.out.println("该列表为空,无需过滤!"); return; } demoFilterChain.doFilter(list); }}
import java.util.List;
/** * @title: BFilterImpl * @Author junyu * @Date: 2020/7/18 13:34 * @Version 1.0 */public class BFilterImpl implements DemoFilter{
@Override public void doFilter(List list, DemoFilterChain demoFilterChain) { System.out.println("BFilterImpl is beginning"); System.out.println("list`s body:"); list.stream().forEach(one ->{ System.out.print( one + ","); }); demoFilterChain.doFilter(list); }}

        一个整合类:

/** * @title: FilterHolder * @Author junyu * @Date: 2020/7/18 9:21 * @Version 1.0 */public class FilterHolder{ private transient DemoFilter filter;
public DemoFilter getFilter() { return filter; }
public void setFilter(DemoFilter filter) { this.filter = filter; }}

        一个过滤器链表:

import java.util.List;
/** * @title: DemoFilterChain * @Author junyu * @Date: 2020/7/18 9:35 * @Version 1.0 */public class DemoFilterChain{ FilterHolder filterHolder; DemoFilterChain next;
DemoFilterChain(List<DemoFilter> list){ if (list.isEmpty()) { return; } filterHolder = new FilterHolder(); filterHolder.setFilter(list.get(0)); list.remove(0); next = new DemoFilterChain(list); }
public void doFilter(List list) { if (filterHolder != null) { DemoFilter filter = filterHolder.getFilter(); filter.doFilter(list,next); } }}

        进行测试:

import java.util.ArrayList;import java.util.List;
/** * @title: TestMain * @Author junyu * 旧巷里有一个穿着白衬衫笑起来如太阳般温暖我的少年。 * 记忆里有一个穿着连衣裙哭起来如孩子般讨人喜的女孩。 * 他说,哪年树弯了腰,人见了老,桃花落了白发梢,他讲的笑话她还会笑,那便是好。 * 她说,哪年国改了号,坟长了草,地府过了奈何桥,她回头看时他还在瞧,就不算糟。 * @Date: 2020/7/18 13:40 * @Version 1.0 */public class TestMain {
public static void main(String[] args) { List<DemoFilter> list = new ArrayList<>(); AFilterImpl aFilter = new AFilterImpl(); BFilterImpl bFilter = new BFilterImpl(); list.add(aFilter); list.add(bFilter); DemoFilterChain demoFilterChain = new DemoFilterChain(list);
List<String> filterList = new ArrayList<>(); filterList.add("this is filter string"); filterList.add("this is filter end");
demoFilterChain.doFilter(filterList);
}}

输出结果:


AFilterImpl is beginning

BFilterImpl is beginning

list`s body:

this is filter string,this is filter end,


        至此,过滤器模式已经编写完毕,工作中可以用并且面试也可以提一下,毕竟框架源码中过滤器模式也不少。

以上是关于设计模式之过滤器模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之过滤器模式

23种设计模式之过滤模式

设计模式之单例模式

设计模式之使用Java 流式过滤实现过滤器模式链式过滤

Java进阶篇设计模式之六 ----- 组合模式和过滤器模式

struts2入门之拦截器