决策链设计模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者与接收者之间的耦合。在这个模式中,通常会有一系列处理对象(Handler),每个对象都包含对下一个处理对象的引用。当一个请求进入时,它首先被当前处理对象处理,如果当前对象不能处理该请求,它会将请求传递给下一个处理对象,依此类推,直到请求被处理或者到达链的末端。
详细说明
1. 结构
- Handler(处理者接口):定义一个处理请求的接口,通常包含一个设置下一个处理者的方法(如
setNextHandler
)和一个处理请求的方法(如handleRequest
)。 - ConcreteHandler(具体处理者):实现处理者接口,处理它负责的请求。如果它不能处理该请求,则将请求传递给下一个处理者。
- Client(客户端):创建处理链,并向链头的处理者发送请求。
2. 工作流程
- 客户端创建一个处理链,通常是通过设置每个处理者的下一个处理者来实现。
- 客户端向链头的处理者发送请求。
- 链头的处理者首先尝试处理请求,如果它能够处理,则处理请求并结束流程;如果不能处理,则将请求传递给下一个处理者。
- 这个过程一直持续到请求被处理或者到达链的末端。
3. 优点
- 解耦:请求发送者不需要知道哪个对象会处理请求,处理者也不需要知道请求的发送者。
- 灵活性:可以动态地改变处理链的结构,增加或删除处理者。
- 单一职责原则:每个处理者只负责处理特定类型的请求,符合单一职责原则。
4. 缺点
案例
假设我们有一个请假审批系统,员工可以提交请假申请,申请需要经过不同级别的审批:组长、经理、总监。每个级别的审批者只能审批一定天数以内的请假申请,超过其权限的申请需要传递给下一个级别的审批者。
代码示例
// Handler接口
interface LeaveApprover {
void setNextApprover(LeaveApprover nextApprover);
void approveLeave(int days);
}
// 具体处理者:组长
class TeamLeader implements LeaveApprover {
private LeaveApprover nextApprover;
@Override
public void setNextApprover(LeaveApprover nextApprover) {
this.nextApprover = nextApprover;
}
@Override
public void approveLeave(int days) {
if (days <= 2) {
System.out.println("Team Leader approved the leave request.");
} else if (nextApprover != null) {
nextApprover.approveLeave(days);
} else {
System.out.println("Leave request cannot be approved.");
}
}
}
// 具体处理者:经理
class Manager implements LeaveApprover {
private LeaveApprover nextApprover;
@Override
public void setNextApprover(LeaveApprover nextApprover) {
this.nextApprover = nextApprover;
}
@Override
public void approveLeave(int days) {
if (days <= 5) {
System.out.println("Manager approved the leave request.");
} else if (nextApprover != null) {
nextApprover.approveLeave(days);
} else {
System.out.println("Leave request cannot be approved.");
}
}
}
// 具体处理者:总监
class Director implements LeaveApprover {
private LeaveApprover nextApprover;
@Override
public void setNextApprover(LeaveApprover nextApprover) {
this.nextApprover = nextApprover;
}
@Override
public void approveLeave(int days) {
if (days <= 10) {
System.out.println("Director approved the leave request.");
} else if (nextApprover != null) {
nextApprover.approveLeave(days);
} else {
System.out.println("Leave request cannot be approved.");
}
}
}
// 客户端
public class LeaveApprovalSystem {
public static void main(String[] args) {
// 创建处理链
LeaveApprover teamLeader = new TeamLeader();
LeaveApprover manager = new Manager();
LeaveApprover director = new Director();
teamLeader.setNextApprover(manager);
manager.setNextApprover(director);
// 提交请假申请
teamLeader.approveLeave(3); // 经理审批
teamLeader.approveLeave(7); // 总监审批
teamLeader.approveLeave(15); // 无法审批
}
}
在这个案例中,我们通过决策链设计模式实现了请假审批系统。每个级别的审批者只能处理一定天数以内的请假申请,超过其权限的申请会传递给下一个级别的审批者。这样,我们实现了请求的灵活处理,并且避免了请求发送者与接收者之间的耦合。