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

编程入门 行业动态 更新时间:2024-10-28 08:18:23

<a href=https://www.elefans.com/category/jswz/34/1771399.html style=完整责任链模式——回旋链"/>

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

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

上期在责任链模式的末尾说要聊一下完整责任链模式——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;
}

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

FilterChain

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

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

有了实现类,我们来看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);}
}

思考:

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

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

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

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

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

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

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

即如下代码:

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

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

测试

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

看下结果

总结

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

最好能 debug 走一遍。

我们下期见!

更多推荐

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

本文发布于:2023-06-25 17:20:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/881894.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:完整   模式   责任

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!