责任链模式概述
对于请求存在多个处理者,每个处理者都会包含下一个处理者的引用,从而形成链的形式,请求会沿着链进行传递,直到有处理者处理请求为止;同时也可以让所有处理者都对请求进行处理,形成闭环(如查询多个系统的数据组装成一个对象用于前端展示就可使用闭环的形式)。
主要包含以下角色
(1)抽象处理者角色:定义一个处理请求的接口,包含抽象的处理方法和一个后继处理者;
(2)具体处理者角色:实现抽象处理者的抽象方法,判断能否处理本次请求,如果可以处理则处理,否则将请求转给它的后继者;
(3)客户类角色:创建处理链,并向链头的具体处理者对象提交请求,该角色不关心处理细节和请求的传递过程。
业务场景
员工请求审批,请假的天数多少审批的人不同
leaveDays <= 3 组长审批 groupLeader
3 < leaveDays <= 5 项目经理审批 projectManager
5 < leaveDays <= 10 副总经理审批 deputyGm
10 < leaveDays 总经理审批 Gm
实现代码如下:
请求类
public class RequestInfo {
private int leaveDays;//请假天数
public int getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(int leaveDays) {
this.leaveDays = leaveDays;
}
}
抽象处理者
public abstract class AbstractHandler {
private AbstractHandler abstractHandler;//下一个处理者
public AbstractHandler getAbstractHandler() {
return abstractHandler;
}
public void setAbstractHandler(AbstractHandler abstractHandler) {
this.abstractHandler = abstractHandler;
}
//抽象的请假审批方法
public abstract void approve(RequestInfo requestInfo);
}
组长处理者
public class GroupLeaderHandler extends AbstractHandler{
@Override
public void approve(RequestInfo requestInfo) {
if(requestInfo.getLeaveDays() <= 3){
System.out.println("组长已经审批" + requestInfo.getLeaveDays() + "天假期");
}else {
//大于三天无权限审批,将请求传递给下一个处理者
getAbstractHandler().approve(requestInfo);
}
}
}
项目经理处理者
public class ProjectManagerHandler extends AbstractHandler{
@Override
public void approve(RequestInfo requestInfo) {
if(3 < requestInfo.getLeaveDays() && requestInfo.getLeaveDays() <= 5){
System.out.println("项目经理已经审批" + requestInfo.getLeaveDays() + "天假期");
}else {
//大于5天无权限审批,将请求传递给下一个处理者
getAbstractHandler().approve(requestInfo);
}
}
}
副总经理处理者
public class DeputyGmHandler extends AbstractHandler {
@Override
public void approve(RequestInfo requestInfo) {
if(5 < requestInfo.getLeaveDays() && requestInfo.getLeaveDays() <= 10){
System.out.println("副总经理已经审批" + requestInfo.getLeaveDays() + "天假期");
}else {
//大于10天无权限审批,将请求传递给下一个处理者
getAbstractHandler().approve(requestInfo);
}
}
}
总经理处理者
public class GmHandler extends AbstractHandler{
@Override
public void approve(RequestInfo requestInfo) {
if(10 < requestInfo.getLeaveDays()){
System.out.println("总经理已经审批" + requestInfo.getLeaveDays() + "天假期");
}
}
}
客户类
//创建处理者对象
GroupLeaderHandler groupLeaderHandler = new GroupLeaderHandler();
ProjectManagerHandler projectManagerHandler = new ProjectManagerHandler();
DeputyGmHandler deputyGmHandler = new DeputyGmHandler();
GmHandler gmHandler = new GmHandler();
//定义处理链
groupLeaderHandler.setAbstractHandler(projectManagerHandler);
projectManagerHandler.setAbstractHandler(deputyGmHandler);
deputyGmHandler.setAbstractHandler(gmHandler);
//创建请求类
RequestInfo requestInfo = new RequestInfo();
requestInfo.setLeaveDays(20);//请假天数是变动的
//向链头的具体处理者对象提交请求开始处理请求
System.out.println("提交" + requestInfo.getLeaveDays() + "天请假申请");
groupLeaderHandler.approve(requestInfo);
当处理者再次增加时创建类继承抽象处理者类实现起处理方法即可,便于拓展