完整责任链模式——回旋链

举报
一条coding 发表于 2022/06/11 00:20:41 2022/06/11
【摘要】 哈喽,大家好,我是一条。 上期在责任链模式的末尾说要聊一下完整责任链模式——Filter。我称之为回旋链。 具体什么意思了就是我处理完责任链到目标方法,然后还能回到责任链,即我需要在目标方法之前和之后...

哈喽,大家好,我是一条。

上期在责任链模式的末尾说要聊一下完整责任链模式——Filter。我称之为回旋链。

具体什么意思了就是我处理完责任链到目标方法,然后还能回到责任链,即我需要在目标方法之前和之后都做处理。

在实际的源码中也是这样使用的,一块看下代码吧!

定义Filter

首先需要一个Filter接口,以及doFilter方法。

public interface Filter {

    void doFilter(Requset requset, Response response, FilterChain chain);
}

@AllArgsConstructor
@Data
public class Requset {
    public String param;
}

@Data
@AllArgsConstructor
public class Response {
    public String msg;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

FilterChain chain存储多个Filter,及链中的结点。

FilterChain

下面就到核心部分,之前需要先创建几个Filter实现类,最少两个。

public class HttpFilter implements Filter{
    @Override
    public void doFilter(Requset requset, Response response, FilterChain chain) {
        // 模拟Filter的处理
        requset.param += "123";
    }
}

public class EncodingFilter implements Filter{
    @Override
    public void doFilter(Requset requset, Response response, FilterChain chain) {
        response.msg +="666";
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

有了实现类,我们来看FilterChain怎么搞。

首先需要有一个添加Filter到链中的方法,同时应该把目标方法的目标类传进来。

如下:

public class FilterChain{
    List<Filter> filters =new ArrayList<>();
    Target target;

    public void setTarget(Target target) {
        this.target = target;
    }

    public void addFilter(Filter filter){
        filters.add(filter);
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

思考:

从HttpFilter到EncodingFilter,即filter链的执行过程由谁来控制?

对,FilterChain ,那么第一个Filter怎么进入呢,即FilterChain的入口在哪里?

FilterChain如果作为入口,那么其应该也类似HttpFilter、EncodingFilter,即需要实现 filter 接口。

@Override
    public void doFilter(Requset requset, Response response, FilterChain chain) {
        
    }

  
 
  • 1
  • 2
  • 3
  • 4

doFilter 里面要做的其实就是获取实际的Filter,并执行其 doFilter 方法。

那么多个 Filter 执行的顺序又要怎么决定?

我们就需要一个下标或者叫游标。

即如下代码:

 int index = 0;
 
 @Override
    public void doFilter(Requset requset, Response response, FilterChain chain) {
        Filter filter = filters.get(index);
  				index ++;
    		filter.doFilter(requset,response,chain);
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

filters.get(index)这里还需要考虑下标越界问题,修正如下:

@Override
public void doFilter(Requset requset, Response response, FilterChain chain) {
    if (index < filters.size()){
        Filter filter = filters.get(index);
        index ++;
        filter.doFilter(requset,response,chain);
    }else {
        target.hello();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

测试

ok,做个测试类

public class MainTest {
    public static void main(String[] args) {
        HttpFilter httpFilter = new HttpFilter();
        EncodingFilter encodingFilter = new EncodingFilter();
        FilterChain chain = new FilterChain();
        chain.addFilter(httpFilter);
        chain.addFilter(encodingFilter);
        chain.setTarget(new Target());
        chain.doFilter(new Requset("req"),new Response("res"),chain);
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

看下结果

总结

以上就是责任链模式实际中的完整应用,一定要自己敲一遍代码深入理解,融会贯通。

最好能 debug 走一遍。

我们下期见!

文章来源: blog.csdn.net,作者:一条coding,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/skylibiao/article/details/125225659

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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