一、什么是责任链模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

二、责任链模式的优点

1、责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。
2、责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象处理。
3、增强给对象指派职责的灵活性。通过增加新的具体处理者,可以提高系统的灵活性,以适应新的变化。
4、减少了相应类之间的耦合。

三、责任链模式的示例分析

下面我们以一个请假的例子来说明责任链模式的实现:
在一个公司,请假需要经过经理、总监、总经理的审批,每个审批者都有权限审批一定天数的假期,如果超过权限范围,则需要继续上报。



public abstract class Handler {
protected Handler successor;

public void setSuccessor(Handler successor) {
this.successor = successor;
}

public abstract void handleRequest(int request);
}

public class ConcreteHandler1 extends Handler {

@Override
public void handleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println(this.getClass().getName() + "处理请求 " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}

public class ConcreteHandler2 extends Handler {

@Override
public void handleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println(this.getClass().getName() + "处理请求 " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}

public class ConcreteHandler3 extends Handler {

@Override
public void handleRequest(int request) {
if (request >= 20 && request < 30) {
System.out.println(this.getClass().getName() + "处理请求 " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}

public class Client {
public static void main(String[] args) {
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
h1.setSuccessor(h2);
h2.setSuccessor(h3);

int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };

for (int request : requests) {
h1.handleRequest(request);
}
}
}

运行结果:
ConcreteHandler1处理请求 2
ConcreteHandler1处理请求 5
ConcreteHandler2处理请求 14
ConcreteHandler3处理请求 22
ConcreteHandler2处理请求 18
ConcreteHandler1处理请求 3
ConcreteHandler3处理请求 27
ConcreteHandler3处理请求 20

从上面的例子中可以看出,责任链模式的优势:
1、客户端只需要将请求发送到链上,而无须关心请求的处理细节和请求的传递过程;
2、提高了系统的灵活性,它支持动态的增加或者删除责任;
3、增强了给对象指派职责的灵活性,当工作流程发生变化时,可以动态地改变链内的成员或者调动它们的次序;
4、责任链可以避免指派者和接受者之间的循环依赖。