Soul网关里面的各个插件都是采用的是责任链模式,今天我们就来聊一聊责任链模式。
什么是责任链模式
- 将请求的发送和接受解耦,让多个接受对象都有机会处理这个请求。将这个接受对象串成一条链,并沿着这条链传递这个请求,知道链上的某个对象能够处理它为止。
- 实际上责任链模式还有一种变体,那就是请求会被所有的处理器都处理一边,不存在终止的情况。
- 其实我们可以将责任链模式看成是一个生产汽车的流水线,整条流水线是一条责任链,每个工人相当于一个Handler,装轮胎的是一个装轮胎的Handler,喷漆的工人是一个喷漆的Handler,大家各自完成自己的任务,整条流水线一起完成生产汽车这个任务。
责任链模式主要解决了什么问题?
- 请求和处理解耦
责任链上的处理者会负责处理请求,用户只需要将请求发送到责任链上,无需关心请求处理的细节和请求的传递。 - 降低处理过程的复杂性
用户在处理请求的过程中,可以将一个大的处理拆分成多个Handler对象,这些Handler对象都绑定到这个责任链上,每个Handler都只处理自己负责的那部分功能,最终一起完成任务;这样做同时使得对请求处理的拓展变得非常方便。
责任链模式的使用场景
- 过滤器、拦截器;
- Netty 的编码、解码过程;
- JS中的事件冒泡;
代码示例
代码这块主要有三个部分组成:Handler接口(IHandler)、Handler处理器、责任链(HandlerChain)。
IHandler
package com.example.demo.designPattern.chains.array;
public interface IHandler {
boolean handler();
}
HandlerA
package com.example.demo.designPattern.chains.array;
public class HandlerA implements IHandler {
@Override
public boolean handler() {
boolean handled = false;
//...
System.out.println("Handler A process...");
return handled;
}
}
HandlerB
package com.example.demo.designPattern.chains.array;
public class HandlerB implements IHandler {
@Override
public boolean handler() {
boolean handled = false;
// ...
System.out.println("Handler B process...");
return handled;
}
}
HandlerChain
package com.example.demo.designPattern.chains.array;
package com.example.demo.designPattern.chains.array;
import java.util.ArrayList;
import java.util.List;
public class HandlerChain {
private List<IHandler> handlers = new ArrayList<>();
// 绑定Handler
public void addHandler(IHandler handler) {
this.handlers.add(handler);
}
// 执行责任链上Handler的处理
public void handler() {
for (IHandler handler : handlers) {
boolean handled = handler.handler();
if (handled) {
break;
}
}
}
}
Main函数测试
package com.example.demo.designPattern.chains.array;
public class Application {
public static void main(String[] args) {
//1.创建一个责任链
HandlerChain chain = new HandlerChain();
//2.绑定两个处理的Handler
chain.addHandler(new HandlerA());
chain.addHandler(new HandlerB());
//3.执行处理方法
chain.handler();
}
}
演示结果
责任链模式在框架中运用的好处
我们在引入别人框架的时候,常常无法修改别人的框架源码,但是如果是使用责任链模式,我们只需要往这个责任链里面添加自己的Handler,就可以完成自己的处理过程,非常好的实现了开闭原则。
总结
在责任链模式中,多个处理器依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理器处理完以后再传给C处理器,以此类推,形成责任链。责任链上的每个处理器各自承担自己的职责,所以叫做责任链模式。