责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象作为一个链式结构进行处理。 当请求从一个对象传递到另一个对象时,这些对象可以依次处理请求或将其传递给下一个对象,直到该请求被处理或直到最终没有对象处理请求。
举例来说,想象你要申请一份文件,需要经过三个级别的审批:部门经理、总经理和董事长。每个级别的领导都有不同的权限,如果当前级别无法处理请求,则将请求传递给下一个级别的领导。
让我们看一个基于JAVA的责任链模式的示例代码:
//抽象处理者:领导
abstract class Leader {
protected String name;
protected Leader nextLeader; // 上级领导
public Leader(String name) {
this.name = name;
}
//设置上级领导
public void setNextLeader(Leader leader) {
this.nextLeader = leader;
}
//处理请求
public abstract void handleRequest(LeaveRequest request);
}
//具体处理者1:部门经理
class Director extends Leader {
public Director(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
if (request.getLeaveDays() <= 3) {
System.out.println("员工:" + request.getName() + "请假,天数:" + request.getLeaveDays() + ",理由:" + request.getReason());
System.out.println("部门经理:" + this.name + ",审批通过!");
} else {
if (this.nextLeader != null) {
this.nextLeader.handleRequest(request);
}
}
}
}
//具体处理者2:总经理
class Manager extends Leader {
public Manager(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
if (request.getLeaveDays() <= 10) {
System.out.println("员工:" + request.getName() + "请假,天数:" + request.getLeaveDays() + ",理由:" + request.getReason());
System.out.println("总经理:" + this.name + ",审批通过!");
} else {
if (this.nextLeader != null) {
this.nextLeader.handleRequest(request);
}
}
}
}
//具体处理者3:董事长
class Chairman extends Leader {
public Chairman(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
if (request.getLeaveDays() <= 30) {
System.out.println("员工:" + request.getName() + "请假,天数:" + request.getLeaveDays() + ",理由:" + request.getReason());
System.out.println("董事长:" + this.name + ",审批通过!");
} else {
System.out.println("员工:" + request.getName() + "请假,天数:" + request.getLeaveDays() + ",理由:" + request.getReason());
System.out.println("董事长:" + this.name + ",审批不通过!");
}
}
}
//请求类
class LeaveRequest {
private String name;
private int leaveDays;
private String reason;
public LeaveRequest(String name, int leaveDays, String reason) {
this.name = name;
this.leaveDays = leaveDays;
this.reason = reason;
}
public String getName() {
return name;
}
public int getLeaveDays() {
return leaveDays;
}
public String getReason() {
return reason;
}
}
//客户端代码
public class Client {
public static void main(String[] args) {
//创建责任链上的对象
Leader director = new Director("张三");
Leader manager = new Manager("李四");
Leader chairman = new Chairman("王五");
//设置链中的顺序
director.setNextLeader(manager);
manager.setNextLeader(chairman);
//提交请求
LeaveRequest request1 = new LeaveRequest("小明", 2, "身体不舒服");
director.handleRequest(request1);
Leave Request request2 = new LeaveRequest("小红", 5, "外出旅游");
director.handleRequest(request2);
LeaveRequest request3 = new LeaveRequest("小李", 20, "家里有事");
director.handleRequest(request3);
LeaveRequest request4 = new LeaveRequest("小张", 35, "创业");
director.handleRequest(request4);
}
}
输出结果为:
员工:小明请假,天数:2,理由:身体不舒服
部门经理:张三,审批通过!
员工:小红请假,天数:5,理由:外出旅游
总经理:李四,审批通过!
员工:小李请假,天数:20,理由:家里有事
董事长:王五,审批通过!
员工:小张请假,天数:35,理由:创业
董事长:王五,审批不通过!
从中可以看到,当请假天数超过部门经理和总经理权限时,请求会依次传递给下一级领导,直到被最终的董事长处理。这就是责任链模式的应用。