1 概述
责任链模式(Chain of Responsibility Pattern)是常见的行为模式,它将处理器封装成一条处理链,让请求可以在链上传递。链上的处理器自行决定是否对请求进行处理。
2 责任链模式
一个典型的责任链模式的使用场景是,当一个事件或请求需要被多个处理器处理时。应用责任链模式,将所有的处理器串在一起,然后把请求从链的头部开始传送。各个处理器可以对请求进行判断,选择执行相关逻辑,或者将它传递给下一个处理器。如此一来,解耦了请求者和接收者(所有的处理器)。
一般情况下,链上的处理器需要持续有下一个处理器的引用,以便将请求往后传送,除此之外,单个处理器不需要知道整体的结构,只需专注于自己内部的处理逻辑。处理器的增删改也非常方便,只需在链上进行相应处理即可。
3 案例
现实中,链式处理的案例很多,比如面试流程。一个候选人,需要经过多轮的面试,合格之后,才能入职新公司。这里的面试官,就是处理器,用来处理面试请求。同时,一个公司有多个领域的面试官,Java
面试官,只会选择面试Java
候选人;而HR则会面试所有候选人:
public enum Major {
JAVA, PYTHON, NA
}
// 面试候选人
public class Interviewee {
private String name;
private Major major;
public Interviewee(String name, Major major) {
this.name = name;
this.major = major;
}
public String getName() {
return name; }
public Major getMajor() {
return major; }
@Override
public String toString() {
return "Interviewee " + name + ", majors in " + major;
}
}
// 面试官,子类需要实现自己的面试方法
public abstract class Interviewer {
private Major major;
protected Interviewer nextInterviewer;
public Interviewer(Major major) {
this.major = major;
}
public Major getMajor() {
return major; }
// 重要方法:设置下一个面试官,形成责任链
public void setNext(Interviewer nextInterviewer) {
this.nextInterviewer = nextInterviewer;
};
public abstract boolean interview(Interviewee interviewee);
}
// java面试官
public class JavaInterviewer extends Interviewer {
public JavaInterviewer() {
super