您现在的位置是:首页 >技术教程 >设计模式之责任链模式网站首页技术教程

设计模式之责任链模式

智_永无止境 2024-06-17 10:13:52
简介设计模式之责任链模式

1、前言

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

职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了

2、应用场景和说明

  • 多个对象处理一个请求,具体哪个对象处理该请求由运行时刻自动确定。例如请假流程、参数处理流程
  • 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。例如审批流中,不确定哪一个领导不用审批,只管提交就好
  • 可动态的指定一组对象处理。

3、角色说明

  • 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  • 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  • 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

4、案例分析(审批流程)

在这里插入图片描述

  • AuditHandler:接口,定义需要执行的方法,以及是否跳过当前的Handler
  • ChainHandler:执行链,管理所有的链条节点,以及执行节点方法。
  • XxxxHandler:具体的执行节点,实现 AuditHandler接口。
  • InterfaceTest:客户端

说明:

实现一个审批流,直接领导审核 -> 经理审核 -> CTO审核,其中某一个节点不审批可以直接跳过。

5、代码展示

5.1 AuditHandler接口

public interface AuditHandler {
	// 当前节点是否跳过
    default boolean skip(){
        return false;
    }
    // 执行方法
    void execute(ChainHandler chain);
}

5.2 ChainHandle执行链

public class ChainHandler {
    // 执行链节点的角标
    private int index;

    // 所有的执行链的节点
    private final List<AuditHandler> handlerList = new ArrayList<>();

    public ChainHandler addHandler(AuditHandler handler){
        handlerList.add(handler);
        return this;
    }

    public void execute() {
        if (handlerList.size() == index) {
            System.out.println("审批链执行完成.....");
            return;
        }

        // 按照添加顺序执行
        AuditHandler auditHandler = handlerList.get(index++);
        if (auditHandler.skip()) {
            auditHandler = handlerList.get(index++);
        }

        auditHandler.execute(this);

    }
}

5.3 XxxxHandler具体的角色

// 直属领导角色
public class DirectLeaderHandler implements AuditHandler {
    @Override
    public void execute(ChainHandler chain) {
        System.out.println("直属领导审批完成......");
        chain.execute();
    }
}

// 经理角色
public class ManageHandler implements AuditHandler {
    @Override
    public boolean skip() {
        return true;
    }

    @Override
    public void execute(ChainHandler chain) {
        System.out.println("经理审批完成......");
        chain.execute();
    }
}

// CTO
public class CTOHandler implements AuditHandler {
    @Override
    public void execute(ChainHandler chain) {
        System.out.println("CTO审批完成......");
        chain.execute();
    }
}

5.4 InterfaceTest客户端

public class InterfaceTest extends ChainHandler {
    public static void main(String[] args) {
        ChainHandler chain = new ChainHandler();
        chain.addHandler(new DirectLeaderHandler())
                .addHandler(new ManageHandler())
                .addHandler(new CTOHandler());

        chain.execute();
    }
}

6、源码解析

客户端增加三个Handler,按照添加的顺序执行的分别为直属领导审核->经理审核->CTO审核。但是AuditHandler 接口中定义了是否跳过当前节点,默认是fase。其中ManageHandler 选择了跳过,所以执行的结果该节点就会跳过。下面来看一下运行结果:
在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。