一、场景介绍
考虑如下场景,员工发起一个请假申请,申请沿着公司的管理等级逐步传递,最终审批通过,期间任何一个领导拒绝了该申请,则请假不通过。像这种一个请求,可以由多个对象处理时,可以考虑使用责任链模式。
责任链模式:将请求发送方与接收方解耦,接收方串联在一起依次处理请求。
二、责任链模式结构
责任链模式包含两个角色:
- 抽象处理者
- 具体处理者
classDiagram
Handler <|-- ConcreteHandlerA
Handler <|-- ConcreteHandlerB
Handler : -Handler sucessor
Handler : -boolean handleRequest()
class ConcreteHandlerA{
-boolean handlerRequest()
}
class ConcreteHandlerB{
-boolean handlerRequest()
}
其中最关键的就是引入了抽象处理者,此处因为抽象处理者是由抽象类定义的,所以定义了一个Handler成员变量,用于自引用来构成一个责任链。
缺点
这样构建的责任链请求处理的先后顺序不太直观,可以引入一种责任链对象,HandlerChain,通过HandlerChain来管理。管理具体处理者的方式有两种:
- 通过List集合,通过添加的顺序决定处理的先后顺序
- 通过自定义注解
具体的处理方式参见这两篇博客,这两篇博客使用了不同的管理处理者的方式,并且结合具体的业务场景进行了分析,强烈推荐。
list管理:juejin.cn/post/735171…
三、代码实现
下面通过代码演示文章开头的场景是如何应用责任链模式的。
public abstract class Handler{
protected Handler successor;
public void setSuccessor(Handler successor){
this.successor = successor;
}
public abstract boolean handle(RequestContext ctx);
}
public class Leader1 extends Handler{
public boolean handle(RequestContext ctx){
handlereq
if(this.successor != null){
}
}
}