【设计模式】通过飞书的审批流了解责任链模式
创始人
2025-07-02 12:11:18
0

背景

审批一个内容,可以先从基层管理者(Handler A)开始,如果经过基层管理者无法满足审批条件(handle),将到高层管理者(Handler B)进行审批。

每个人审批节点只处理自己能力范围内的事情,这就和责任链模式十分吻合了。

模式定义

Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.

通过给多个对象处理请求的机会,避免将请求的发送方与其接收方耦合在一起。链接接收对象并沿着链传递请求,直到一个对象处理它。

模式结构

模式实现

1.节点

审批节点定义

package com.example.designpattern.chainofresponsibility.handler;

/**
 * 责任链节点
 *
 * @author hongcunlin
 */
public abstract class Handler {
    /**
     * 下一个审批节点
     */
    protected Handler next;

    /**
     * 处理
     *
     * @param amount 金额
     */
    public abstract void handle(int amount);

    /**
     * 设置下一个节点
     *
     * @param next 节点
     */
    public void setNext(Handler next) {
        this.next = next;
    }
}

审批节点实现,分别是组长、经理、总监

package com.example.designpattern.chainofresponsibility.handler.impl;

import com.example.designpattern.chainofresponsibility.handler.Handler;
import org.springframework.stereotype.Component;

/**
 * 组长
 *
 * @author hongcunlin
 */
@Component("teamLeader")
public class TeamLeader extends Handler {
    /**
     * 上限金额
     */
    private static final Integer LIMITED_AMOUNT = 500;

    @Override
    public void handle(int amount) {
        if (amount < LIMITED_AMOUNT) {
            System.out.println("TeamLeader approved");
        } else if (null != next) {
            next.handle(amount);
        }
    }
}
package com.example.designpattern.chainofresponsibility.handler.impl;

import com.example.designpattern.chainofresponsibility.handler.Handler;
import org.springframework.stereotype.Component;

/**
 * 经理
 *
 * @author hongcunlin
 */
@Component("manager")
public class Manager extends Handler {
    /**
     * 上限金额
     */
    private static final Integer LIMITED_AMOUNT = 1000;

    @Override
    public void handle(int amount) {
        if (amount < LIMITED_AMOUNT) {
            System.out.println("Manager approved");
        } else if (null != next) {
            next.handle(amount);
        }
    }
}
package com.example.designpattern.chainofresponsibility.handler.impl;

import com.example.designpattern.chainofresponsibility.handler.Handler;
import org.springframework.stereotype.Component;

/**
 * 总监
 *
 * @author hongcunlin
 */
@Component("director")
public class Director extends Handler {
    /**
     * 上限金额
     */
    private static final Integer LIMITED_AMOUNT = 1000;

    @Override
    public void handle(int amount) {
        if (amount < LIMITED_AMOUNT) {
            System.out.println("Director approved");
        } else if (null != next) {
            next.handle(amount);
        }
    }
}

2.责任链

构建团组长、经理、总监的审批顺序金额上限由低到高

package com.example.designpattern.chainofresponsibility;

import com.example.designpattern.chainofresponsibility.handler.Handler;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * 责任链
 *
 * @author hongcunlin
 */
@Component("handlerChain")
public class HandlerChain {
    /**
     * 组长
     */
    @Resource(name = "teamLeader")
    private Handler teamLeader;

    /**
     * 经理
     */
    @Resource(name = "manager")
    private Handler manager;

    /**
     * 总监
     */
    @Resource(name = "director")
    private Handler director;

    /**
     * 构建责任链
     */
    @PostConstruct
    public void init() {
        teamLeader.setNext(manager);
        manager.setNext(director);
    }

    /**
     * 处理请求
     *
     * @param amount 金额
     */
    public void handleRequest(int amount) {
        teamLeader.handle(amount);
    }
}

3.测试

package com.example.designpattern.chainofresponsibility;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

/**
 * 责任链模式测试
 *
 * @author hongcunlin
 */
@SpringBootTest
public class DesignPatternTest {
    /**
     * 责任链
     */
    @Resource(name = "handlerChain")
    private HandlerChain handlerChain;

    /**
     * 测试审批
     */
    @Test
    public void test() {
        handlerChain.handleRequest(750);
    }
}

可以看到750元费用的审批,是轮到经理审批的,没问题

500<750<1000

回顾

本文对飞书审批流节点的审批,采用责任链模式实现,同时是基于项目开发中必用的Spring框架的,贴近实际开发。

有空再通过日常生活,聊聊其中涉及的设计模式。

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...