「这是我参与2022首次更文挑战的第33天,活动详情查看:2022首次更文挑战」。
一、什么是责任链模式
日常生活中,我们在公司想要请假,提交审批的时候是不是上面有一堆审批人。但公司一般规定短期的假项目经理就可以直接批准,中期的一般都是部门管理员才能批,稍微长一点可能需要总经理同意才行。
二、责任链模式的实现
/**
* 抽象公司管理员
*/
public abstract class Manager {
private Manager next;
protected Integer hour;
public void setNext(Manager next) {
this.next = next;
}
public Manager getNext() {
return next;
}
public void handleEvent(Integer hour) {
if (this.hour >= hour) {
approved();
} else {
if (next != null) {
next.handleEvent(hour);
} else {
System.out.println("请假时间超过公司规定,只能开除了!");
}
}
}
public abstract void approved();
}
抽象处理者角色,此处为公司管理员,处理请假的事情。
public class ProjectManager extends Manager{
public ProjectManager(){
this.hour = 1;
}
@Override
public void approved() {
System.out.println("项目经理批准了你的请假,请在一小时内回到公司,否则你可能会被扣除15天工资!");
}
}
项目经理,具体处理者,实现了approved方法,可以处理1小时的假期。
public class DepartmentManager extends Manager {
public DepartmentManager() {
this.hour = 2;
}
@Override
public void approved() {
System.out.println("部门管理员批准了你的请假,请在2小时内回到公司,否则你将被扣除一个月的工资!");
}
}
部门管理员
public class GeneralManager extends Manager {
public GeneralManager(){
this.hour = 3;
}
@Override
public void approved() {
System.out.println("总经理批准了你的请假,请在3小时内回到公司,否则将直接开除!");
}
}
总经理
public static void main(String[] args) {
Manager projectManager = new ProjectManager();
Manager departmentManager = new DepartmentManager();
Manager generalManager = new GeneralManager();
projectManager.setNext(departmentManager);
departmentManager.setNext(generalManager);
projectManager.handleEvent(1);
projectManager.handleEvent(2);
projectManager.handleEvent(3);
projectManager.handleEvent(4);
}
客户端,创建了责任链,分别处理了1,2,3,4小时的假期的处理。
三、总结
Handler:抽象处理者角色,包含一个处理事件的方法和一个设置下级(也可以说是上级或者后继者)的方法。
Concreate Handler:具体处理者方法,实现处理事件方法,判断能否处理本次请求,如果不能,就让下级处理。在上面的例子中,直接在抽象处理角色里面将处理方法进行了实现,但处理时具体的方法还需要各个具体处理者去实现,原理还是一致的,只是对方法进行了提炼。
client:客户端,创建处理链,并将请求提交到链头。
优点:
- 降低了系统的耦合性,客户端无需与具体的处理类进行关联。
- 符合开闭原则,可以自由的添加新的具体处理类,由客户端按需求拼接。
- 责任分担,每个类只需处理自己该处理的业务。 缺点:
- 不能保证客户端的请求一定被处理,可能传递到链条的最后都没有被处理。
- 报错不易排查,同时责任链由客户端创建,增加了客户端代码的复杂性。
- 对于比较长的责任链,系统性能受到影响。
责任链模式的两种情况。
- 纯的责任链模式:一个请求必须被某个处理对象接收。一个具体处理者对请求的处理方式只有两种,一个是自己处理,另一个是传递到下级。
- 不纯的责任链模式:一个请求具体处理者可以自己处理一部分,同时将一部分传递到下级,且一个请求可以最终不被任何处理对象接收。