设计模式之过滤器模式
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,
至此,过滤器模式已经编写完毕,工作中可以用并且面试也可以提一下,毕竟框架源码中过滤器模式也不少。
以上是关于设计模式之过滤器模式的主要内容,如果未能解决你的问题,请参考以下文章