设计模式-责任链模式

55 阅读1分钟

一、场景介绍

考虑如下场景,员工发起一个请假申请,申请沿着公司的管理等级逐步传递,最终审批通过,期间任何一个领导拒绝了该申请,则请假不通过。像这种一个请求,可以由多个对象处理时,可以考虑使用责任链模式。

责任链模式:将请求发送方与接收方解耦,接收方串联在一起依次处理请求。

二、责任链模式结构

责任链模式包含两个角色:

  • 抽象处理者
  • 具体处理者
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…

注解管理:juejin.cn/post/716084…

三、代码实现

下面通过代码演示文章开头的场景是如何应用责任链模式的。

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){
        
        }
    }
}