场景:
当一个请求者发起多种请求时,可能存在多个接收者,多个接收者存在某种先后关系或层级时,继续维护这种一对多的请求关系就显得冗余了,这时候多个接受者可以抽象成一个职责链,请求者只需要对职责链发起请求即可,从而实现了请求者和接收者的解耦。
代码:
员工请假,根据天数确定哪一级别领导审批,不用职责链的话,员工得自己确定,用职责链后,员工只需要把请假天数上传到领导链条里即可自动完成审批。
- 定义各个对象
/**
* 抽象处理者
*/
public abstract class Handler {
private Handler nextHandler;
// 当前领导能审批通过的最多天数
public int maxDay;
protected Handler(int maxDay) {
this.maxDay = maxDay;
}
//设置责任链中下一个处理请求的对象
public void setNextHandler(Handler handler) {
nextHandler = handler;
}
protected void handleRequest(int day) {
if (day <= maxDay) {
reply(day);
} else {
if (nextHandler != null) {
//审批权限不够,继续上报
nextHandler.handleRequest(day);
} else {
System.out.println("没有更高的领导审批了");
}
}
}
protected abstract void reply(int day);
}
/**
* 项目经理
*/
class ProjectManager extends Handler {
public ProjectManager(int day) {
super(day);
}
@Override
protected void reply(int day) {
System.out.println(day + "天请假,项目经理直接审批通过");
}
}
/**
* 部门经理
*/
class DepartmentManager extends Handler {
public DepartmentManager(int day) {
super(day);
}
@Override
protected void reply(int day) {
System.out.println(day + "天请假,部门经理审批通过");
}
}
/**
* 总经理
*/
class GeneralManager extends Handler {
public GeneralManager(int day) {
super(day);
}
@Override
protected void reply(int day) {
System.out.println(day + "天请假,总经理审批通过");
}
}
- 建链、执行
public class Test {
private static Handler getChainOfManager(){
Handler projectManager = new ProjectManager(3);
Handler departmentManager = new DepartmentManager(7);
Handler generalManager = new GeneralManager(15);
//创建职责链
projectManager.setNextHandler(departmentManager);
departmentManager.setNextHandler(generalManager);
return projectManager;
}
public static void main(String[] args) {
Handler chain = getChainOfManager();
//发起一次请求
chain.handleRequest(4);
}
}
代码总结:
总共有四个关键元素
- handleRequest:
- 是对主要各个接收者行为的主要抽象,是减少代码冗余的关键函数,如果不能抽象出统一的规则,那么也没有必要用职责链
- maxDay:
- 请求者和接收者都有的参数,是判断那一个接受者谁执行的主要判断依据,最关键的参数
- reply:
- 不同接受者的不同行为,没什么好说的
- setNextHandler:
- 建链的函数,相当于链结构里的next指针