什么是责任链模式
责任链模式是一种行为设计模式,请求会被一个责任链按照顺序处理,每个处理器会处理请求并决定要不要将请求传给下个处理器。
什么时候可以使用责任链模式
当需要做一系列平行操作时,可以使用责任链模式。
例如,需要对用户发表的评论和文章过滤,需要过滤政治敏感、色情相关、不文明等词语,这个时候就可以设计多个敏感词过滤器并组成责任链,将文章内容交给责任链进行处理。
还有一个场景,当接受到一个用户的发起交易的请求时,可能会有多种鉴权的步骤需要进行,需要验证这个用户是否属于系统,这个用户是否合法,是否被冻结,可能需要验证用户的ip,这个时候可以设计一个责任链,用来处理用户的请求,当其中一个不满足时,这个请求就不应该再继续下去。
责任链模式代码演示
责任链实现方式有多种,这里演示使用继承实现责任链。 图片演示:

// 定一个抽象类Handler
public abstract class Handler {
//用来保存下一个Handler的属性,在满足一定条件时将请求交给下个Handler处理
protected Handler successor = null;
//用来设置下个Handler
public void setSuccessor(Handler successor) {
this.successor = successor;
}
//调用真正的处理请求的方法,当满足一定条件时,调用下个Handler处理请求
public final void handle() {
boolean handled = doHandle();
if(!handled && null != successor) {
successor.handle();
}
}
//真正的处理请求的方法,每个具体的Handler必须实现的方法
public abstract boolean doHandle();
}
// 定一个HandlerA,继承Handler类
public class HandlerA extends Handler {
@Override
public boolean doHandle() {
boolean handled = false;
System.out.println("HandlerA ... ");
return handled;
}
}
// 定一个HandlerA,继承Handler类
public class HandlerB extends Handler {
@Override
public boolean doHandle() {
boolean handled = false;
System.out.println("HandlerB ... ");
return handled;
}
}
//定一个HandlerChain类,这个是责任链,保存这链头和链尾
public class HandlerChain {
//链头
private Handler head = null;
//链尾
private Handler tail = null;
//将具体的Handler添加到责任链中
public void addHandler(Handler handler) {
//新添加的Handler是链尾,所以它后面没有任何Handler,设置为null
handler.setSuccessor(null);
//如果第一次添加Handler,那么head和tail指向同一个handler
if(null == head) {
head = handler;
tail = handler;
return;
}
//给当前的链尾设置handler,将最新的handler接到链尾
tail.setSuccessor(handler);
//将链尾指针指向最新的handler
tail = handler;
}
//对外提供方法调用责任链中的handler
public void handle() {
if(null != head) {
head.handle();
}
}
}
public class Application {
public static void main(String[] args) {
HandlerChain chain = new HandlerChain();
chain.addHandler(new HandlerA());
chain.addHandler(new HandlerB());
chain.handle();
}
}
在HandlerChain的实现中,可以使用链表来保存handler,也可以使用数组来保存handler.
责任链的优缺点
优点
- 满足开闭原则,添加新的handler方便。
- 你可以控制请求处理的顺序。
- 单一职责原则。 你可对发起操作和执行操作的类进行解耦。
缺点
- 部分请求可能未被处理
灵活使用责任链
上面的责任链代码中,如果请求内容没有满足否个条件,马上终止处理,也可以灵活变通一下,将判断的代码移除,这样每个处理器都可以走一遍,在某些场景下可以使用。