项目中用到的责任链模式

news2024/11/25 18:54:33

目录

1.什么是责任链?它的原理是什么?

2.应用场景

​3.项目中的应用

传送门:策略模式,工作中你用上了吗?


1.什么是责任链?它的原理是什么?

将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。

                                                                                               以上定义来自《设计模式之美》

2.应用场景

责任链模式的应用场景,在实际工作中,通常有如下两种应用场景。 

  • 操作需要经过一系列的校验,通过校验后才执行某些操作。

 

  • 工作流。企业中通常会制定很多工作流程,一级一级的去处理任务。 

3.项目中的应用

责任链要执行的业务:

public interface AcptRegisterService {

    /**
     * *************
     * @param acptRegisterBO
     */
    void check(AcptRegisterBO acptBusinRegisterBO);

}

责任链第一次执行的实现:


@Slf4j
@Order(1)
@Service
@RequiredArgsConstructor
public class AcptFormExistsCheckImpl implements AcptRegisterService{

    private final AcptformCtrl acptformCtrl;

   
    @Override
    public void check(AcptRegisterBO checkBO) {
       //写自己的业务逻辑

        Boolean counter = BpsCommonUtils.isCounterSystem(checkBO.getOpEntrustWay());
        if (counter) {
            return;
        } else if (StringUtils.isBlank(checkBO.getAcptEnrouteField())){
            // 如果【受理在途校验字段】为空,则校验结束
            return;
        }
}

责任链第二次执行的实现:  

@Slf4j
@Order(2)
@Service
@RequiredArgsConstructor
public class Eservice724ConfigCheckImpl implements AcptRegisterService{

    private final AcptTemplateComCtrl acptTemplateComCtrl;

    private final String STAGING_PROCESS_INSTANCE = "stagingance";

    /**
     *
     *
     * @param acptRegisterBO 
     */
    @Override
    public void check(AcptRegisterBO acptRegisterBO ) {
        Character config76135 = SysConfigUtils.getCharConfig(HsSysConfigConstants.SYSCONFIG_76135);
        if (CHARACTOR_1 != config76135) {
            // 76135开关关闭时,不校验
            return;
        }

        Acpttpl acpttpl = acptTemplateComCtrl.getAcpttpl(acptBusinRegisterCheckBO.getAcptBusinId());
        if (acpttpl.getAcptType() != BUSIN) {
            // 参数类、运营类的业务受理模板没有7*24小时受理开关,不校验
            return;
        }

 责任链第三次执行的实现:

@Slf4j
@Order(3)
@Service
public class ApprovalNodeCheckImpl implements AcptRegisterService{

    @Autowired
    private AcptTemplateCtrl acptTemplateCtrl;

    @Autowired
    private AcptTemplateComCtrl acptTemplateComCtrl;
    @Autowired
    private DependenceConfigCtrl dependenceConfigCtrl;

    @CloudReference
    private WFProcessDefinitionService wfProcessDefinitionService;

//    @Value("${approval.node.acptBusinIds}")
//    private String acptBusinIds;

    /**
     *登记校验
     *
     * @param acptRegisterBO 
     */
    @Override
    public void check(AcptRegisterBO acptRegisterBO ) {
        // 柜台接口不需要人工审核接口校验
        Boolean counter = BpsCommonUtils.isCounterSystem(acptBusinRegisterCheckBO.getOpEntrustWay());
        if (counter) {
            return;
        }
        String acptBusinIds = dependenceConfigCtrl.getApprovalNodeBusinIds();

        String acptBusinId = acptBusinRegisterCheckBO.getAcptBusinId();
        log.info("需要检测人工节点的业务编号:{}", acptBusinId);
        if (StringUtils.isNoneBlank(acptBusinIds)) {
            boolean present = Arrays.stream(StringUtils.split(acptBusinIds, ",")).anyMatch(e -> StringUtils.equals(e, acptBusinId));
            // 不存在需要校验的业务编号,无需处理
            if (!present) {
                return;
            }
        }

具体的应用:

  @Autowired
    private List<AcptRegisterService > acptRegisterServiceList;

    /**
     * 受理信息登记
     *
     * @param input 入参
     * @return
     */
    public PostBpsacptformRegistOutput postBpsacptformRegist(PostBpsacptformRegistInput input) {
        PostBpsacptformRegistOutput output = new PostBpsacptformRegistOutput();
        // 1.登记检查
        AcptRegisterBO acptRegisterBO = new AcptRegisterBO ();
        DataCopyUtil.copyData(input, acptBusinRegisterCheckBO);
        //******************* 1.在途校验 2.业务受理时间校验 3.人工审核节点校验 ************//
        acptRegisterServiceList.forEach(e -> e.check(acptRegisterBO ));
}

传送门:

策略模式,工作中你用上了吗?

给对象讲工厂模式,必须易懂易会

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/401291.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NetApp AFF A900:针对任务关键型应用程序的解决方案

NetApp AFF A900&#xff1a;适用于数据中心的解决方案 AFF A 系列中的 AFF A900 高端 NVMe 闪存存储功能强大、安全可靠、具有故障恢复能力&#xff0c;提供您为任务关键型企业级应用程序提供动力并保持数据始终可用且安全所需的一切。 AFF A900&#xff1a;针对任务关键型应…

关于BLE的一些知识总结

数据包长度对于BLE4.0/4.1来说&#xff0c;一个数据包的有效载荷最大为20字节对于BLE4.2以上&#xff0c;数据包的有效载荷扩大为251字节传输速率在不考虑跳频间隔的情况下&#xff0c;最大传输速率为&#xff1a;1&#xff09;BLE4.0/4.1的理论吞吐率为39kb/s&#xff1b;2&am…

523-(ZCU102E的pin兼容替代卡) 基于 XCZU15EG的双 FMC通用信号处理板

&#xff08;ZCU102E的pin兼容替代卡&#xff09; 基于 XCZU15EG的双 FMC通用信号处理板 一、板卡概述 本板卡基于Xilinx Zynq Ultrascale MPSOC系列SOC XCZU15EG-FFVB1156架构&#xff0c;PS端搭载一组64-bit DDR4&#xff0c;容量32Gb&#xff0c;最高可稳定运行在240…

solidworks调用toolbox出现未配置怎么办

问题背景 本人最近在跟随B站恶补solidworks&#xff0c;学习链接如下 https://www.bilibili.com/video/BV1iw411Z7HZ/?spm_id_from333.337.search-card.all.click 但是在学习的过程中遇到了这样的问题 智能点现在配置&#xff0c;正常的应该是这样的 扒拉了网上所有的解决办…

04从零开始学Java之可能是最详细的Java环境配置教程

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者前言在上一篇文章中&#xff0c;壹哥给大家重点讲解了Java实现跨平台的原理&#xff0c;不知道你现在有没有弄清楚呢&#xff1f;如…

window vscode编辑appsmith源码

前言 本来最开始用的idea打开wsl中的appsmith&#xff0c;卡得一批。最后没办法&#xff0c;用自己的电脑装成ubuntu server&#xff0c;然后vscode的远程开发对appsmith源码进行编辑。如果自己电脑内存16个G或者更大可能打开wsl中的估计会还好&#xff0c;我公司电脑只有8g所…

Virtualbox Vagrant 迁移与恢复

前 言 window10电脑重新安装C盘。重装前正常使用的VirtualBox虚拟机&#xff0c;启动失败&#xff0c;先是启动报各种找不到{uuid.vmdk}文件的错误&#xff0c;使用原来的虚拟机配置文件虽然能正常启动&#xff0c;但是关闭虚拟机后&#xff0c;xxx.vbox配置文件的快照顺序又被…

MySQL主从复制,读写分离

目录 一、MySQL主从复制介绍 MySQL复制过程分成三步 二、主库配置master 1、步骤1 2、第二步:重启Mysql服务 3、第三步&#xff1a;登录Mysql数据库&#xff0c;执行下面SQL 4、第四步&#xff1a;登录Mysql数据库&#xff0c;执行下面SQL&#xff0c;记录下结果中File和…

vue2 使用 cesium 【第二篇-相机视角移动+添加模型】

vue2 使用 cesium 【第二篇-相机视角移动添加模型】 搞了一阵子 cesium&#xff0c;小白入门&#xff0c;这东西很牛逼&#xff0c;但是感觉这东西好费劲啊&#xff01;网上资料不多&#xff0c;每个人的用法又不一样&#xff0c;操作起来真的是绝绝子。之前写了一篇 vue2 使用…

【C#进阶】C# 反射

序号系列文章11【C#基础】C# 预处理器指令12【C#基础】C# 文件与IO13【C#进阶】C# 特性文章目录前言1&#xff0c;反射的概念2&#xff0c;使用反射访问特性3&#xff0c;反射的用途4&#xff0c;反射的优缺点比较4.1 优点&#xff1a;4.2 缺点&#xff1a;5&#xff0c;System…

吲哚菁绿-巯基,ICG-SH,科研级别试剂,吲哚菁绿可用于测定心输出量、肝脏功能、肝血流量,和对于眼科血管造影术。

ICG-THIOL,吲哚菁绿-巯基 中文名称&#xff1a;吲哚菁绿-巯基 英文名称&#xff1a;ICG-THIOL 英文别名&#xff1a;ICG-SH 性状&#xff1a;绿色粉末 溶剂&#xff1a;溶于二氯甲烷等其他常规有机溶剂 稳定性&#xff1a;冷藏保存&#xff0c;避免反复冻融。 存储条件&…

搭建SpringBoot多模块微服务项目脚手架(二)

搭建SpringBoot多模块微服务项目脚手架(二) 文章目录搭建SpringBoot多模块微服务项目脚手架(二)1.概述2.封装 MybatisPlus2.1.封装MybatisPlus1.安装依赖2.安装lombok插件3.配置数据库链接信息2.2.创建公共子模块1.创建公共模块common2.创建common_utils模块3.创建service_base…

【C++知识点】文件操作

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;C/C知识点 &#x1f4e3;专栏定位&#xff1a;整理一下 C 相关的知识点&#xff0c;供大家学习参考~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;…

【六祎 - 前端】npm是什么?npm是网站、注册表、命令行工具组成;windows安装nvm;使用nvm安装npm;

nvm管理并安装npmnpm中文文档npm是什么&#xff1f;npm 由三个独立的部分组成&#xff1a;快速入门命令行npm用法npm配置查找包&#xff08;package&#xff09;windows安装nvm使用nvm安装npmps:切换版本下载npm之后的一些配置&#xff08;Optional)npm中文文档 →_→点我查看…

Java的stream流

Java 8中引入的新特性&#xff0c;stream流通过与Lambda表达式结合&#xff0c;采用函数式编程&#xff0c;简化数组、集合操作&#xff0c;提高效率。 我们操作一个集合&#xff0c;就把他看作一个流&#xff0c;整个流依次执行&#xff0c;&#xff08;可以类比为一个管道&a…

企业官网怎么做?

企业官网是企业展示形象和吸引潜在客户的重要渠道之一&#xff0c;因此如何打造一款优秀的企业官网显得尤为重要。本文将从策划、设计、开发和上线等方面&#xff0c;为您介绍企业官网的制作步骤。 一、策划 1.明确目标 企业官网的制作需要明确目标&#xff0c;即确定官网的主…

4. SSM 整合

文章目录1. 引言2. 创建工程3. SSM 整合2. 统一结果封装3. 统一异常处理3.1 异常处理器3.2 项目异常处理方案3.2.1 异常分类3.2.2 异常解决方案3.2.3 异常解决方案的具体实现4. 前后台协议联调4.1 列表功能4.2 添加功能4.3 修改功能4.4 删除功能5. 拦截器5.1 拦截器概念1. 引言…

mysql数据库之innodb存储引擎架构之内存架构

一、逻辑存储结构 mysql5.5版本开始&#xff0c;默认使用innodb存储引擎&#xff0c;它擅长事务处理&#xff0c;具有崩溃恢复特性&#xff0c;在日常开发中使用非常广泛。 架构图&#xff08;左侧为内存架构&#xff0c;右侧为磁盘架构&#xff09; 二、 内存架构。 1、缓冲…

SpringBoot使用Redis实现缓存

目录 实现步骤 1. 在 pom.xml 配置文件中添加如下依赖 2. 在 application.properties 中添加如下配置 3. 新建 RedisConfig.class&#xff0c;继承 CachingConfigurerSupport&#xff0c;添加如下方法 4. 新建 RedisService.class 添加如下方法 注意&#xff1a;cacheKey…

看完书上的栈不过瘾,为什么不动手试试呢?

一.栈的基本概念1.栈的定义栈&#xff08;Stack&#xff09;&#xff1a;是只允许在一端进行插入或删除的线性表。首先栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作。其中注意几点&#xff1a;栈顶&#xff08;Top&#xff09;&#xff1a;线性表…