目录
一、前言
责任链模式(Chain of Responsibility Pattern)也叫职责链模式,是一种行为型设计模式,职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链。并沿着这条链传递该请求,直到有一个对象处理它为止。
责任链模式由以下角色组成:
Handler(抽象处理者):
定义一个处理请求的接口,包含处理请求的方法,还包含一个指向下一个处理者的引用(即链中的下一个处理者)
Concrete Handler(具体处理者):
继承或实现抽象处理者接口,具体处理请求的逻辑在这里实现,如果不能处理当前请求,则将请求传递给下一个处理者
Client(客户端):
负责创建并组装职责链,将请求发送给链中的第一个处理者
整个责任链模式的结构图:
二、责任链模式
比如一些请求制度,我们可以设置组长能够审批3天因为的假期,经理可以审批10天以内的假期,CEO可以审批30天以内的假期,不允许超过30天,这种时候就可以使用责任链模式进行演示。
首先创建Handler类:
java
public abstract class Handler {
public Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(int request);
}
接着创建具体的实现类:
java
public class ConcreteHandlerOne extends Handler{
@Override
public void handleRequest(int request) {
if(request >= 0 && request < 3){
System.out.println(String.format("组长同意请假:%s天", request));
}else if(successor != null){
successor.handleRequest(request);
}
}
}
public class ConcreteHandlerTwo extends Handler{
@Override
public void handleRequest(int request) {
if(request >= 3 && request < 10){
System.out.println(String.format("经理同意请假:%s天", request));
}else if(successor != null){
successor.handleRequest(request);
}
}
}
public class ConcreteHandlerThree extends Handler{
@Override
public void handleRequest(int request) {
if(request >= 10 && request <= 30){
System.out.println(String.format("CEO同意请假:%s天", request));
}else {
System.out.println("请假天数不符合要求");;
}
}
}
最后是客户端Client类:
java
public class Client {
public static void main(String[] args) {
Handler handler1 = new ConcreteHandlerOne();
Handler handler2 = new ConcreteHandlerTwo();
Handler handler3 = new ConcreteHandlerThree();
handler1.setSuccessor(handler2);
handler2.setSuccessor(handler3);
handler1.handleRequest(1);
handler1.handleRequest(4);
handler1.handleRequest(15);
handler1.handleRequest(40);
}
}
运行结果:
三、总结
优点与缺点:
优点:
降低耦合度:
请求的发送者和接收者解耦,发送者无需知道具体的接收者是谁,也无需了解处理链的结构
增加灵活性:
可以在运行时动态地添加或修改处理者,从而灵活地改变职责链
职责分担:
每个处理者只需关注自己能处理的任务,职责单一明确
增强扩展性:
增加新的具体处理者非常方便,不影响已有的系统
缺点:
可能导致请求未被处理:
如果链条上的所有处理者都不能处理请求,可能导致请求未被处理,除非在链的末端有个默认处理者
调试复杂:
由于请求是在链条上进行传递,调试起来较为困难,尤其是在链条较长或处理逻辑复杂时
性能问题:
如果链条很长,可能会影响系统性能,尤其是在每个处理者都需要进行复杂判断时
应用场景:
请求的处理需要多个对象中的一个或多个进行处理:
如多个审批人依次审批请求的场景,每个审批人根据自己的权限或条件决定是否审批或将请求传递给下一个审批人
动态指定请求的处理者:
如在一个系统中,根据不同的请求类型动态选择不同的处理者
需要在处理者之间进行职责分离:
如在责任明确的系统中,每个模块各司其职,如日志记录、权限校验、数据处理等
例如时间处理系统、审批工作流、请求过滤器