定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些处理请求的对象连成一条链,并沿着这条链传递该请求,直到有对象处理它。简单的说就是为请求创建一个接收此请求对象的链。 责任链模式是行为型设计模式。
适用场景:
一个请求的处理需要多个对象当中的一个或多个协助处理。
类图:
Handler:抽象的请求处理者,持有一个后继处理者。
ConcreteHandler:具体的请求处理者,在这里个类里面,负责它职责范围内的请求处理,如果不处理,就继续转发请求给后继者。
可以看到,责任链就是当前的请求处理对象持有下一个请求处理对象的引用,下一个也是如此,并且每一个处理对象都有自己的职责范围,这样就形成了一条责任链,请求从链的第一个处理对象传递,直到有对象处理它。
Example:
通常我们在公司上班,遇到突发事件都需要请假,而请假根据天数不同需要不同的主管来同意我们的请求,比如我们要请1-3天的假期一级主管就可以直接同意,不需要再往上请求,如果是4-6天就需要二级主管同意,如果是7-10天就需要3级主管同意,大于10天需要我们的boss来同意才行。现在我们用责任链模式来模拟这个场景。
//处理者基类
public abstract class LeaveHandler {
//持有指向后继者的引用
protected LeaveHandler successor;
//设置后继者
public void setSuccessor(LeaveHandler successor) {
this.successor = successor;
}
public abstract void handleRequest(int request);
}
//一级主管
public class FirstLevelSupervisor extends LeaveHandler {
@Override
public void handleRequest(int request) {
if (request<=3){
System.out.println("一级主管已同意");
}else {
if (successor!=null){
//请请求传递给责任链的下一个处理对象处理
successor.handleRequest(request);
}
}
}
}
//二级主管
public class SecondLevelSupervisor extends LeaveHandler{
@Override
public void handleRequest(int request) {
if (4<=request&&request<=6){
System.out.println("二级主管已同意");
}else {
if (successor!=null){
//请请求传递给责任链的下一个处理对象处理
successor.handleRequest(request);
}
}
}
}
//三级主管
public class ThirdLevelSupervisor extends LeaveHandler {
@Override
public void handleRequest(int request) {
if (7<=request&&request<=10){
System.out.println("三级主管已同意");
}else {
if (successor!=null){
//请请求传递给责任链的下一个处理对象处理
successor.handleRequest(request);
}
}
}
}
//Boss
public class Boss extends LeaveHandler {
@Override
public void handleRequest(int request) {
System.out.println("Boss已同意");
}
}
//Client
public static void main(String[] args) {
LeaveHandler firstLevelSupervisor=new FirstLevelSupervisor();
LeaveHandler secondLevelSupervisor=new SecondLevelSupervisor();
LeaveHandler thirdLevelSupervisor=new ThirdLevelSupervisor();
LeaveHandler boss=new Boss();
//形成责任链
firstLevelSupervisor.setSuccessor(secondLevelSupervisor);
secondLevelSupervisor.setSuccessor(thirdLevelSupervisor);
thirdLevelSupervisor.setSuccessor(boss);
//向一级主管提交7天的假期申请
firstLevelSupervisor.handleRequest(7);
}
结果:
三级主管已同意
可以看到FirstLevelSupervisor->SecondLevelSupervisor->ThirdLevelSupervisor->Boss形成了一条责任链,当客户提交一个请求时,请求会沿着责任链传递,直到有一个具体的处理者负责处理该请求。
责任链模式的优点
- 请求的发送者和处理解耦。
- 可以根据不同的需求进行动态的组合。
- 增强了给对象指派职责的灵活性,可以很方便的修改、增加、减少责任链中的元素。
责任链模式的缺点
影响性能。当责任链太长,如果只有最后一个可以处理,就会创建许多处理对象并且请求会在它们之间传递。
参考: 大话设计模式