完整责任链模式——回旋链
哈喽,大家好,我是一条。
上期在责任链模式的末尾说要聊一下完整责任链模式——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
- 点赞
- 收藏
- 关注作者
评论(0)