设计模式之过滤器模式

举报
努力的小雨 发表于 2023/12/25 10:30:59 2023/12/25
【摘要】 博主上次分析完cas客户端源码后,发现了其实就是一个过滤器模式,对请求以及session一直做校验,每个过滤器都有各自的工作,互不影响耦合性低,所以就模仿其源码,做了一次过滤器模式的学习,图示如下其实过滤器整个类可以不用,只不过在jetty中,过滤器整合类不知有过滤器还有其他属性,比如config配置等。如下:参考即可好了,我们来看一下过滤器模式,一个过滤器接口定义方法,多个实现类去实现具体...

博主上次分析完cas客户端源码后,发现了其实就是一个过滤器模式,对请求以及session一直做校验,每个过滤器都有各自的工作,互不影响耦合性低,所以就模仿其源码,做了一次过滤器模式的学习,图示如下
image.png
其实过滤器整个类可以不用,只不过在jetty中,过滤器整合类不知有过滤器还有其他属性,比如config配置等。如下:参考即可
image.png
好了,我们来看一下过滤器模式,一个过滤器接口定义方法,多个实现类去实现具体操作过滤,一个整合类增加一个过滤器,一个过滤器链表去实现以节点类型,依次进行过滤

该接口进行定义方法:

 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);
 }
DemoFilter

多个实现类:

 import java.util.List;

 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);
     }
 }

AFilterImpl
 import java.util.List;

 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);
     }
 }
BFilterImpl

一个整合类

 public class FilterHolder{
     private transient DemoFilter filter;
 
     public DemoFilter getFilter() {
         return filter;
     }
 
     public void setFilter(DemoFilter filter) {
         this.filter = filter;
     }
 }
FilterHolder

一个过滤器链表

 import java.util.List;
 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);
         }
     }
 }
DemoFilterChain

进行测试

import java.util.ArrayList;
import java.util.List;

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,

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。