理解名词
责任链模式(Chain Of Responsibility Design Pattern)是一种行为型设计模式,责任在这里理解为“应该做的事情”,结合链来理解就是,多个处理器以链式结构顺序组织起来,依次对同一个请求执行该处理器应该做的事情。
在GoF《设计模式》中,定义如下:
将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。
作用
复用和扩展
在框架开发中,我们可以利用它们来提供框架的扩展点,能够让框架的使用者在不修改框架源码的情况下,基于扩展点定制化框架的功能。
适用场景
过滤器,拦截器,工作流编排。例如Servlet Filter, Spring Interceptor, Netty ChanelHandler
应用场景举例:
- UGC应用(论坛,微博)敏感词过滤,实现多个处理器分别对涉黄词,广告,反动词汇进行处理(用****替换敏感词)
- 对 HTTP 请求的过滤功能,比如鉴权、限流、记录日志、验证参数等
- 对 HTTP 请求进行路由分发。
代码示例
责任链由两个部分组成,Handler类以及HandlerChain类
Handler类
// 首先定义Handler接口
public interface IHander {
boolean handle();
}
// Handler实现类定义
public class HandlerA implements IHandler {
@Override
public boolean handle() {
boolean handled = false;
// 处理逻辑
return handled;
}
}
// Handler实现类定义
public class HandlerB implements IHandler {
@Override
public boolean handle() {
boolean handled = false;
// 处理逻辑
return handled;
}
}
// Handler实现类定义
public class HandlerC implements IHandler {
@Override
public boolean handle() {
boolean handled = false;
// 处理逻辑
return handled;
}
}
HandlerChain类
public class HandlerChain {
private List<IHandler> handlers = new ArrayList<>();
public void addHandler(IHandler handler) {
this.handlers.add(handler);
}
// 模式一:被其中一个处理器处理之后,该处理器之后的处理器无需处理该请求。
public void handle() {
for(IHandler handler: handlers) {
boolean handled = handler.handle();
if (handled) {
break;
}
}
}
// 模式二:一个请求将被每一个处理器处理一次
public void handle() {
for(IHandler handler: handlers) {
handler.handle();
}
}
}
使用举例
public class Application {
public static void main(String[] args) {
HandlerChain chain = new HandlerChain();
chain.addHandler(new HandlerA());
chain.addHandler(new HandlerB());
chain.addHandler(new HandlerC());
chain.handle();
}
}
业界经典实现
- Servlet Filter
- Spring Interceptor