责任链模式是将请求和处理进行分离,处理请求的对象可由多个节点完成,多个节点连接成一条链,当某个节点处理不了请求时就会将请求传递给下个节点去处理,如果可以处理就直接结束。主要涉及3个角色:
- 抽象责任链节点:是一个抽象类,包含下个节点的引用和处理请求的抽象方法。
- 具体实现节点:抽象责任链节点的具体实现,实现处理请求的具体业务逻辑。
- 客户端:构建节点链条,发送请求,责任链首节点开始处理请求。
示例
已请假审批为例,员工请假首先要到组长那去审批,一般请假天数<=3天组长可以审批,如果请假天数<=5天总监可以审批,请假天数<=7天得部长审批,超过了7天直接被驳回。对于组长、总监、部长可以构建责任链,请假审批可以视为处理请求。
// 抽象责任链节点
public abstract class Handler {
// 下一个节点
private Handler nextHandler;
// 处理请求
protected abstract void handleRequest(int days);
public Handler getNextHandler() {
return nextHandler;
}
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
}
// 组长节点
public class PmHandler extends Handler {
@Override
protected void handleRequest(int days) {
if (days <= 3) {
System.out.println("组长同意了请假审批!");
} else {
if (getNextHandler() != null) {
getNextHandler().handleRequest(days);
} else {
System.out.println("请假天数太多被驳回!");
}
}
}
}
// 总监节点
public class DirectorHandler extends Handler {
@Override
protected void handleRequest(int days) {
if (days <= 5) {
System.out.println("总监同意了请假审批!");
} else {
if (getNextHandler() != null) {
getNextHandler().handleRequest(days);
} else {
System.out.println("请假天数太多被驳回!");
}
}
}
}
// 部长节点
public class MinistorHandler extends Handler {
@Override
protected void handleRequest(int days) {
if (days <= 7) {
System.out.println("部长同意了请假审批!");
} else {
if (getNextHandler() != null) {
getNextHandler().handleRequest(days);
} else {
System.out.println("请假天数太多被驳回!");
}
}
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Handler pmHandler = new PmHandler();
Handler directorHandler = new DirectorHandler();
Handler ministorHandler = new MinistorHandler();
// 构建链条
pmHandler.setNextHandler(directorHandler);
directorHandler.setNextHandler(ministorHandler);
// 处理请假请求
pmHandler.handleRequest(2);
pmHandler.handleRequest(5);
pmHandler.handleRequest(7);
pmHandler.handleRequest(10);
}
}
运行结果如下:

责任链模式.png