设计模式之过滤器模式

2024-06-27 10:00:06 浏览数 (1)

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

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

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

该接口进行定义方法:

代码语言:javascript复制
 1 import java.io.IOException;
 2 import java.util.List;
 3 
 4 /**
 5  * @title: DemoFilter
 6  * @Author junyu
12  * @Version 1.0
13  */
14 public interface DemoFilter{
15 
16     void doFilter(List list, DemoFilterChain demoFilterChain);
17 }

多个实现类:

这段代码实现了一个简单的过滤器功能。当调用 AFilterImpl 类的 doFilter 方法时,它会首先检查传入的列表是否为空,如果为空则输出一条消息并直接返回,否则将列表传递给 demoFilterChain 对象进行进一步的过滤处理。

代码语言:javascript复制
 1 import java.util.List;
 2 
 3 /**
 4  * @title: AFilterImpl
 5  * @Author junyu
11  * @Version 1.0
12  */
13 public class AFilterImpl implements DemoFilter{
14 
15     @Override
16     public void doFilter(List list, DemoFilterChain demoFilterChain) {
17         System.out.println("AFilterImpl is beginning");
18         if (list.isEmpty()) {
19             System.out.println("该列表为空,无需过滤!");
20             return;
21         }
22         demoFilterChain.doFilter(list);
23     }
24 }

BFilterImpl 类的作用是实现 DemoFilter 接口中的过滤方法 doFilter,在方法中打印输出列表的内容,并将列表传递给过滤器链中的下一个过滤器进行进一步处理。

代码语言:javascript复制
 1 import java.util.List;
 2 
 3 /**
 4  * @title: BFilterImpl
 5  * @Author junyu
11  * @Version 1.0
12  */
13 public class BFilterImpl implements DemoFilter{
14 
15     @Override
16     public void doFilter(List list, DemoFilterChain demoFilterChain) {
17         System.out.println("BFilterImpl is beginning");
18         System.out.println("list`s body:");
19         list.stream().forEach(one ->{
20             System.out.print( one   ",");
21         });
22         demoFilterChain.doFilter(list);
23     }
24 }

一个整合类在这里,FilterHolder 类专门用于持有 DemoFilter 对象,并提供了标准的访问接口,以便其他代码可以获取或者更新这个 DemoFilter 对象。

代码语言:javascript复制
 1 **
 2  * @title: FilterHolder
 3  * @Author junyu
 9  * @Version 1.0
10  */
11 public class FilterHolder{
12     private transient DemoFilter filter;
13 
14     public DemoFilter getFilter() {
15         return filter;
16     }
17 
18     public void setFilter(DemoFilter filter) {
19         this.filter = filter;
20     }
21 }

一个过滤器链表,每个 DemoFilterChain 对象包含一个 FilterHolder 对象来保存一个过滤器,并且通过 next 字段链接到下一个 DemoFilterChain 对象,从而形成一个链表结构。构造函数用递归的方式创建了整个链表,方法 doFilter 用于按顺序执行每个过滤器的 doFilter 方法,实现过滤器链的功能。

代码语言:javascript复制
 1 import java.util.List;
 2 
 3 /**
 4  * @title: DemoFilterChain
11  * @Version 1.0
12  */
13 public class DemoFilterChain{
14     FilterHolder filterHolder;
15     DemoFilterChain next;
16 
17     DemoFilterChain(List<DemoFilter> list){
18         if (list.isEmpty()) {
19             return;
20         }
21         filterHolder = new FilterHolder();
22         filterHolder.setFilter(list.get(0));
23         list.remove(0);
24         next = new DemoFilterChain(list);
25     }
26 
27     public void doFilter(List list) {
28         if (filterHolder != null) {
29             DemoFilter filter = filterHolder.getFilter();
30             filter.doFilter(list,next);
31         }
32     }
33 }

进行测试

代码语言:javascript复制
 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 /**
 5  * @title: TestMain
 6  * @Author junyu
12  * @Version 1.0
13  */
14 public class TestMain {
15 
16     public static void main(String[] args) {
17         List<DemoFilter> list = new ArrayList<>();
18         AFilterImpl aFilter = new AFilterImpl();
19         BFilterImpl bFilter = new BFilterImpl();
20         list.add(aFilter);
21         list.add(bFilter);
22         DemoFilterChain demoFilterChain = new DemoFilterChain(list);
23 
24         List<String> filterList = new ArrayList<>();
25         filterList.add("this is filter string");
26         filterList.add("this is filter end");
27 
28         demoFilterChain.doFilter(filterList);
29 
30     }
31 }

输出结果:

AFilterImpl is beginning

BFilterImpl is beginning

list`s body:

this is filter string,this is filter end,

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

0 人点赞