前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之过滤器模式

设计模式之过滤器模式

原创
作者头像
努力的小雨
修改2024-06-27 10:00:06
1300
修改2024-06-27 10:00:06
举报
文章被收录于专栏:灵墨AI探索室

博主上次分析完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腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档