责任链模式的学习与使用

news2024/12/24 21:46:03

1、责任链模式的学习

  责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许你将请求沿着处理链进行传递,直到有一个处理者能够处理该请求。责任链模式将请求的发送者和接收者解耦,使多个对象都有机会处理请求。
在这里插入图片描述
责任链模式的工作方式如下:

  1. 客户端创建一个处理链,并将请求发送给链的第一个处理者。
  2. 每个处理者在接收到请求后,首先判断自己是否能够处理该请求。如果能够处理,则进行处理并结束;如果不能处理,则将请求传递给下一个处理者。
  3. 这个过程会一直持续下去,直到有一个处理者处理请求或者请求到达链的末尾。

2、责任链模式的使用

  假设你正在开发一个在线购物系统,需要实现库存检查的功能。系统中有三个库存检查器,分别是仓库库存检查器、店铺库存检查器和供应商库存检查器。当用户下单购买商品时,需要按照一定的顺序进行库存检查,确保商品库存充足。
库存检查抽象类

public abstract class InventoryCheck {


    protected InventoryCheck next;

    public InventoryCheck(InventoryCheck inventoryCheck) {
        this.next = inventoryCheck;
    }

    /**
     * 库存检查
     */
    protected abstract void check();
}

店铺库存检查(具体的处理者)

public class ShopInventoryCheck extends InventoryCheck {
    public ShopInventoryCheck(InventoryCheck inventoryCheck) {
        super(inventoryCheck);
    }

    @Override
    protected void check() {
        System.out.println("开始店铺库存检查");
        if (false) {
            System.out.println("店铺库存满足");
            return;
        }
        System.out.println("店铺库存不满足");
        if (Objects.nonNull(next)) {
            next.check();
        }
    }
}

供应商库存检查(具体的处理者)

public class SupplierInventoryCheck extends InventoryCheck {

    public SupplierInventoryCheck(InventoryCheck inventoryCheck) {
        super(inventoryCheck);
    }

    @Override
    protected void check() {
        System.out.println("开始供应商库存检查");
        if (false) {
            System.out.println("供应商库存满足");
            return;
        }
        System.out.println("供应商库存不满足");
        if (Objects.nonNull(next)) {
            next.check();
        }
    }
}

仓库库存检查(具体的处理者)

public class WareHouseInventoryCheck extends InventoryCheck {

    public WareHouseInventoryCheck(InventoryCheck inventoryCheck) {
        super(inventoryCheck);
    }

    @Override
    protected void check() {
        System.out.println("开始进行仓库库存检查");
        if (false) {
            System.out.println("仓库库存满足");
            return;
        }
        System.out.println("仓库库存不满足");
        if (Objects.nonNull(next)) {
            next.check();
        }
    }
}

责任链模式客户端

public class ChainClient {

    public static void main(String[] args) {

        InventoryCheck shopInventoryCheck = new ShopInventoryCheck(null);

        InventoryCheck supplierInventoryCheck = new SupplierInventoryCheck(shopInventoryCheck);

        InventoryCheck wareHouseInventoryCheck = new WareHouseInventoryCheck(supplierInventoryCheck);

        wareHouseInventoryCheck.check();
    }
}
开始进行仓库库存检查
仓库库存不满足
开始供应商库存检查
供应商库存不满足
开始店铺库存检查
店铺库存不满足

3、总结

责任链模式的优点包括:

  1. 将请求的发送者和接收者解耦,让请求的发送者不需要知道具体的接收者是谁。
  2. 可以动态地组织和扩展处理链。
  3. 提供了灵活性,可以根据需要调整处理流程。

责任链模式适用的场景包括:

  1. 有多个对象可以处理同一请求,但具体处理者在运行时才能确定。
  2. 请求发送者不需要知道哪个对象将处理请求以及请求的处理过程。

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

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

相关文章

计算机网络通信过程

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

案例|某城商行Zabbix 监控架构分享

编者荐语: 东莞银行董天保将出席7月份Zabbix大会分享案例经验,欢迎参加! 以下文章来源于有田菜也香 ,作者AcidGo 东莞银行董天保先生将于7月份参加Zabbix大会分享使用经验,欢迎扫码参加! 【导读】某银行…

openCV(三)绘制几何图形

openCV内置了几何图形绘制函数,通过简单的操作就可以绘制几何图形。例如,可以绘制直线、矩形、圆形、椭圆、多边形、文字等,分别对应函数cv2.line()、cv2.rectangle()、cv2.circle()、cv2.ellipse()、cv2.polylines()、cv2.putText()。 下面来…

Mysql进阶【3】论述Mysql优化

1.通过explain查看sql的详细信息 Mysql的sql优化企业里边主要是对慢sql进行优化,对语句进行优化,对索引进行优化 通过explain查看sql的详细信息,并且分析sql语句存在的问题,比如有没有使用到索引、使用了索引还是慢是不是索引设…

第一章_从减库存聊起

在多线程高并发场景下,为了保证资源的线程安全问题, jdk 为我们提供了 synchronized 关键字和 ReentrantLock 可重入锁,但是它们只能保证一个 jvm 内的线程安全。在分布式集群、微服务、云原生横行的当下,如何保证不同进程、不同…

2023年京东618预售数据:传统滋补成预售黑马,预售额超27亿

这一期主要分享一下此次京东618预售期间的一个黑马行业——传统滋补。不管是从预售量和预售额来看,传统滋补品类的成绩都是此次大促中的佼佼者。 究其原因,近几年养生滋补也掀起了一股“国潮风”。在小红书、抖音等社交平台上,关于“健康养生…

车载摄像头专用——拓尔微低功耗超高集成PMIC TMI7205B

“2023将是汽车行业的大变革之年,全球迎来L2向L3/L4跨越窗口。”越高级别的自驾对周围环境感知要求越高,车载摄像头“高清化”势不可挡,目前已从传统的100万直接跃升至800万像素摄像头,甚至在供应层面,已有超1500万高像…

Vue.js 中的 $forceUpdate 方法是什么?有什么作用?

Vue.js 中的 $forceUpdate 方法是什么?有什么作用? 在 Vue.js 中,$forceUpdate 方法是一个很常见的方法之一。它可以强制组件重新渲染,从而让组件的视图更新。本文将介绍 $forceUpdate 方法的使用方法和作用,并给出一…

代码随想录算法训练营第二天| 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵||

LeetCode977.有序数组的平方 链接:有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 看到这道题,我第一反应就是把每个数的平方算出来然后排序&#xff…

结构体大小的计算

结构体计算要遵循字节对齐原则。 结构体默认的字节对齐一般满足三个准则: 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需…

【并发篇】04 线程池核心参数

这道题其实就是在问java中线程池的实现类ThreadPoolExecutor,这个类参数最多的构造方法有7个参数。 线程池本质上就是管理一组线程,用来执行提交给线程池的任务。提交任务用的是submit(task)。 corePoolSize设置核心线程数。核心线程执行完任务后仍然需…

java培训机构学校教学教务选课管理平台springboot+vue

近年来,随着培训机构机构规模的逐渐增大,人工书写的方式已经不能满足如此庞大的数据。为了更好的适应信息时代的高效性,一个利用计算机来实现培训机构教务管理工作的系统将必然诞生。基于这一点,设计了一个培训机构教务管理系统&a…

视觉相机模型以及投影原理推导——(单目)

相机模型简介 参考文献:视觉SLAM十四讲、视觉惯性SLAM理论与源码分析、该博客、文中的公式直接引用上面的文章,如有侵权请联系本人删除 1、针孔相机模型 投影过程 三维世界中的物体(目标点)P反射光线,通过相机光心&am…

RL - 强化学习 蒙特卡洛 (Monte-Carlo) 方法计算状态价值

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/131102145 在强化学习中,状态价值 (State Value) 是指在特定状态下,智能体能够从该状态开始执行一系列动作&…

你还在用U盘和聊天工具来处理文档吗?ONLYOFFICE的协作空间来解决你的痛点了!

你还在用U盘和聊天工具来处理文档吗?ONLYOFFICE的协作空间来解决你的痛点了! 说起Office办公软件,大家想到的首先就是Word、PPT、Excel,这是微软Office的三件套,从我们当代人念大学写论文时候开始学着用,到…

PDF或图片文档内容识别、关系抽取

需求 自动识别法院和公积金中心的文书(调解书、判决书、裁定书、通知书)扫描件(PDF或图片),获取特定结构的数据,自动对比。抽取结构如: [标题,诉讼案号,执行案号,公积金,{原告: [姓名, 单位, 生…

无代码让我彻夜难眠

最近人工智能非常的火,特别是GPT,让一些程序员很慌。 但是GPT终归还是一个智能的搜索引擎,你可以问它某个问题或者算法问题,你让它快速开发一个系统,它能吗? 不能! 但是无代码可以&#xff0…

【Android Studio】Flamingo版本 更新gradle插件 7.+到8.+

步骤 build.gradle(module) android {namespace //adddefaultConfig {applicationId }}AndroidManifest.xml 取消package属性 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/andr…

nginx负载均衡+反向代理

最近业务上遇到一个需求&#xff0c;其它系统因业务校验需要调用上级系统进行数据发送或校验&#xff0c;如果上级系统停机维护&#xff0c;其它下级系统发送的http通讯会丢失&#xff0c;还要一次次补发数据&#xff0c;耗费人工与时间。使用nginx反向代理解决了部分需求。 目…

【Java项目】从0到1完成Nacos配置文件扩展和共享

文章目录 环境配置配置文件名称空间和组扩展配置共享配置文件配置文件优先级 使用nacos作用配置中心的好处在于我们可以在云端上修改配置文件之后&#xff0c;使得本地的配置重新生效&#xff0c;从而做到不用重启项目也可以加载新的配置。 环境配置 首先引入依赖&#xff0c;…