津津乐道设计模式 - 责任链模式详解(教你更优雅的处理商城下单业务)

news2024/9/23 11:26:57

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

津津乐道设计模式 - 责任链模式详解

  • 什么是责任链模式
  • 责任链模式适用场景
  • 生活案例
  • 案例代码
  • 责任链模式优缺点
  • 结语

什么是责任链模式

责任链模式是一种行为设计模式,它将请求的发送者和接收者解耦,通过一条由多个处理器组成的链来处理请求。每个处理器都有机会处理请求,但具体由哪个处理器处理取决于请求的特征和处理器的设置

在这里插入图片描述

责任链模式适用场景

  • 请求需要经过多个处理器依次处理:当一个请求需要经过多个处理器依次处理,并且每个处理器只处理自己负责的部分时,可以使用责任链模式。例如,审批流程中的多级审批,每个审批人只负责自己的审批任务,而不同级别的审批人形成一个处理链。
  • 需要动态添加或删除处理器:责任链模式允许在运行时动态添加或删除处理器,灵活性较高。这样可以根据业务需求动态调整处理链,实现动态的责任分配。
  • 需要在处理器之间进行解耦:责任链模式将请求的发送者和接收者解耦,发送者只需要将请求发送给责任链的头部,而不需要知道具体的接收者是谁。这样可以简化系统的设计,使各个处理器之间的耦合度降低。

总之,责任链模式适用于处理请求的场景,其中请求需要经过多个处理器依次处理,并且处理器之间存在某种逻辑关系。通过责任链模式,可以提高系统的灵活性和可扩展性,减少请求发送者与接收者之间的耦合。

生活案例

现实生活中我们也经常能看到责任链模式的应用:

1)比如流程审批就是一个很好的例子,只要终端用户提交申请,根据申请的内容信息,自动建立一条责任链,然后就可以开始流转了。

2)再比如我们有一个在线购物系统,用户下单后需要依次进行以下处理:库存检查、价格计算、优惠券验证、订单生成等。每个处理步骤都由不同的处理器来完成,而且处理器之间存在一定的逻辑关系。每个处理器负责处理一项具体的任务,并且决定是否将请求传递给下一个处理器。

案例代码

我们就以上面购物系统下单处理为例子,进行代码演示:

首先,定一个订单简单订单Order类

/**
 * 定义一个简单的订单对象
 * @author micro
 */
public class Order {
    
    //订单编号
    private String  OrderNo;

    //商品名称
    private String  GoodsName;

    //商品价格
    private String  GoodsPrice;

    public String getOrderNo() {
        return OrderNo;
    }

    public void setOrderNo(String orderNo) {
        OrderNo = orderNo;
    }

    public String getGoodsName() {
        return GoodsName;
    }

    public void setGoodsName(String goodsName) {
        GoodsName = goodsName;
    }

    public String getGoodsPrice() {
        return GoodsPrice;
    }

    public void setGoodsPrice(String goodsPrice) {
        GoodsPrice = goodsPrice;
    }
}

定义一个抽象处理器类 OrderHandler,其中包含一个指向下一个处理器的引用和一个处理请求的方法:

public abstract class OrderHandler {
    protected OrderHandler nextHandler;

    public void setNextHandler(OrderHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract void handleRequest(Order order);
}

定义库存检查处理器

public class StockCheckHandler extends OrderHandler {
    @Override
    public void handleRequest(Order order) {
        // 执行库存检查的任务
        System.out.println("执行库存检查");

        // 判断是否需要传递给下一个处理器
        if (nextHandler != null) {
            nextHandler.handleRequest(order);
        }
    }
}

定义价格计算处理器

public class PriceCalculationHandler extends OrderHandler {
    @Override
    public void handleRequest(Order order) {
        // 执行价格计算的任务
        System.out.println("执行价格计算");

        // 判断是否需要传递给下一个处理器
        if (nextHandler != null) {
            nextHandler.handleRequest(order);
        }
    }
}

优惠券验证处理器

public class CouponValidationHandler extends OrderHandler {
    @Override
    public void handleRequest(Order order) {
        // 执行优惠券验证的任务
        System.out.println("执行优惠券验证");

        // 判断是否需要传递给下一个处理器
        if (nextHandler != null) {
            nextHandler.handleRequest(order);
        }
    }
}

定义订单生成处理器

class OrderGenerationHandler extends OrderHandler {
    @Override
    public void handleRequest(Order order) {
        // 执行订单生成的任务
        System.out.println("执行订单生成");
    }
}

最后测试类

在这里插入代码片

完整代码结构如下

在这里插入图片描述
在这个示例中,我们定义了订单类 Order 和抽象处理器类 OrderHandler,并实现了具体的处理器类 StockCheckHandlerPriceCalculationHandlerCouponValidationHandlerOrderGenerationHandler。客户端代码通过创建处理器实例,并将它们按照特定的顺序连接成处理器链,然后将订单请求传递给处理器链的头部处理器。

每个处理器负责自己的任务,并根据业务逻辑决定是否将请求传递给下一个处理器。在示例中,订单请求经过库存检查、价格计算、优惠券验证和订单生成的处理步骤。

最终执行效果

在这里插入图片描述
这样,通过使用责任链模式,可以将复杂的处理流程拆分为多个独立的处理步骤,并且每个处理器只需关注自己的任务,使系统具有良好的灵活性和可扩展性。

责任链模式优缺点

责任链模式的优点

  • 解耦责任:责任链模式将请求的发送者和接收者解耦,发送者不需要知道具体的接收者,只需将请求发送给第一个处理器即可,每个处理器只关注自己的责任范围。
  • 灵活性和可扩展性:可以动态地添加或修改处理器,而不影响其他处理器的工作。可以根据业务需求灵活组合处理器形成不同的处理链。
  • 可以处理复杂的请求流程:当一个请求需要经过多个处理步骤,并且每个处理步骤都有可能处理或者传递请求时,责任链模式能够很好地处理这种复杂的请求流程。

责任链模式的缺点

  • 无法保证请求一定被处理:由于请求的传递是通过处理器链进行的,如果链中的处理器没有正确配置或者没有处理请求的逻辑,请求可能无法被正确处理。
  • 可能引起性能问题:当责任链中的处理器较多时,每个请求都需要从链头开始遍历,直到找到能够处理它的处理器。如果链中的处理器过多或者处理逻辑复杂,可能会导致性能下降。
  • 可能导致系统调试和理解困难:由于请求的处理是分散在多个处理器中进行的,当出现问题时,需要追踪整个责任链来定位问题所在,可能会增加调试和理解的复杂性。

因此,在使用责任链模式时需要谨慎考虑,权衡其优缺点,并根据实际情况选择是否使用该模式。

结语

本章节主要介绍了责任链模式、责任链模式适用场景、责任链模式的优缺点,并以商场系统下单验证的场景模拟责任链模式的使用方法,如果本文对你有用,欢迎关注收藏评论,后续将陆续推出贴切生活的搞笑讲解方式带大家一起学编程~

样例代码:https://github.com/lhmyy521125/toher-designmode

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

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

相关文章

Linux系统的目录结构与基本命令

目录 Linux系统使用注意 Linux严格区分大小写 Linux文件"扩展名" Linux系统中常见的后缀名称: Linux中所有内容以文件形式保存 Linux中存储设备都必须在挂载之后才能使用 Linux系统的目录结构 Linux分区与Windows分区 Linux系统文件架构 Linux系…

用AI帮助小学一年级记住常用字

这几天娃就要一年级毕业放假了,感觉时间过得太快了。再开学就要上二年级,可汉字表上的区区三四百字,咋就那么的难读?难记?喊他们来认字,拉都拉不过来。哎,愁啊,替他们焦虑。突发奇想…

Docker发布VUE vhr微人事前端(Nginx 403 forbidden)

本文代码来源于(感谢作者) GitHub - lenve/vhr: 微人事是一个前后端分离的人力资源管理系统,项目采用SpringBootVue开发。 发布过程参考博主 【Docker】使用docker容器发布vue项目_docker 发布vue_TOP灬小朋友的博客-CSDN博客 1.创建Do…

食品空压机数据采集远程监控系统解决方案

食品行业是一个需求量大、安全标准高、竞争激烈的行业。随着人们消费水平的提升,对食品的品质、口味、营养、卫生等方面有了更高的要求。食品空压机是食品生产过程中不可缺少的设备,它可以提供稳定的压缩空气,用于食品加工、包装、运输等环节…

大聪明教你学Java | 深入浅出聊 ThreadPoolExecutor

前言 🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。 🍊支持作者: 点赞👍、关注💖、留言💌~ 在《阿里巴巴 Java 开发手册》中有这么一个强制要求:“线程池不允许使用 Executors 去创建,而是…

6月第4周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩)发布!

飞瓜轻数发布2023年6月19日-6月25日飞瓜数据UP主排行榜(B站平台),通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况,为用户提供B站号综合价值的数据参考,根据UP主成长情况用户能够快速找到运营能力强的B…

【计算机网络】数据链路层之随机接入-CSMA/CD协议

1.概念 2.信号碰撞(冲突) 3.解决方案 CSMA/CD 4.争用期(端到端往返时延) 5.最小帧长 6.最大帧长 7.指数退避算法 8.信道利用率 9.帧发送流程 10.帧接受流程 12.题目1 13.题目2 14.题目3 15 小结

linux:docker-compose下载后无法使用

参考: Ubuntu 安装 Docker & Docker-Compose - 知乎 解决方法: PC上下载二进制文件,之后filezilla上传到服务器对应目录

项目一、黑客攻击系统功能菜单->功能菜单

功能菜单 项目需求 注:本小节"是写功能的选项,在有图形化的app当中,肯定有选项 这章节就是讲怎么写选项的" 什么是图形化:把文字翻译成图像或者是图片等等。 功能选项: 1.网站404攻击 2.网站篡改攻击 3.网站…

Acer宏碁超轻薄笔记本非凡Swift系列SF314-57G原装出厂Win10系统工厂模式 恢复原厂OEM系统

Acer宏基超轻薄笔记本电脑,Acer宏碁Swift系列非凡SF314-57G原装出厂Windows10系统(工厂模式) 恢复原厂预装OEM系统 系统自带所有驱动、Office办公软件、出厂主题壁纸LOGO、 Acer Care Center、Quick Access等预装程序 所需要工具:32G或以上的U盘&#…

chatgpt 用来取名字

Object ,array 相对 string,int 来说是什么类型, 分别用英文名称来定义他们的类型类别

应用在数字音频工作站中的ADC芯片

数字音频工作站(DAW)是电子设备或应用软件用于记录,编辑和产生的音频文件。数字音频工作站具有多种配置,从便携式计算机上的单个软件程序到集成的独立单元,一直到由中央计算机控制的众多组件的高度复杂的配置。无论配置…

vue3-实战-15-管理后台-动态实现菜单权限和按钮权限

目录 1-菜单路由权限分析 2-菜单权限实现 2.1-路由拆分 2.2-动态计算当前用户的权限 3-按钮权限实现 1-菜单路由权限分析 目前我们系统中有:login(登录页面)、404(404一级路由)、任意路由、首页(/home)、数据大屏、权限管理(三个子路由)商品管理模块(四个子路由…

libevent(14)bufferevent的client端例子

前面我们写了基于bufferevent的server端&#xff0c;这里我们写1个基于bufferevent的client端。 test_libevent_client.cpp&#xff1a; #include <string.h> #include <errno.h> #include <stdio.h> #include <signal.h> #include <netinet/in.h&…

wsl下面的子系统启用systemctl

下载地址 https://github.com/gdraheim/docker-systemctl-replacement 操作 mv /usr/bin/systemctl /usr/bin/systemctl.old #对原文件进行备份sudo scp /mnt/c/Users/Administrator/Desktop/systemctl.py /usr/bin/systemctl #把项目中的systemctl.py文件拷贝到/use/bin/ 目…

vitest测试 element-plus二次封装组件时css文件报错

bug描述&#xff1a;使用 element-plus 二次封装组件&#xff0c;使用 vitest 测试时报错&#xff0c;对于 element-plus 的 css 样式识别失败。 报错内容&#xff1a; Unknown file extension “.css” for D:\demo\omniButton\node_modules.pnpm\registry.npmmirror.comeleme…

SQL专家云快速解决阻塞

背景 当数据库突然产生严重阻塞时&#xff0c;运维人员要快速找到阻塞的源头并处理&#xff0c;让业务快速恢复。但是大多数运维人员只掌握了sp_who2、sp_lock等简单的语句&#xff0c;存在以下不足&#xff1a; 找不到真正的源头&#xff0c;过程中会误杀掉大量的会话&#xf…

IDE写代码,你用哪一款比较好?

目前市面上IDE种类非常多&#xff0c;很多程序员都会纠结究竟用哪一种IDE写代码比较好呢&#xff1f;IDE不过是写代码的辅助工具而已&#xff0c;运行环境和书写格式其实都一样&#xff0c;关键在于你用哪一款比较顺手。以下为大家推荐一些&#xff0c;一些常用的IDE工具&#…

助推人脉从资源化变成资产化,开利网络持续赋能广东商合会数字化

在企业经营发展的过程中&#xff0c;资源尤其是人脉资源的积累和应用是企业一直要做的事情&#xff0c;能够帮助企业建立强大的关系网络、从中也可能诞生更多的商机。开利网络服务客户商合会科技发展&#xff08;广东&#xff09;有限公司正是基于人脉资源的对接与增值而研发了…

【疑难解决】EasyCVR激活授权不成功的原因排查与解决

我们的EasyCVR等视频平台授权方式有这几种&#xff1a;加密机、加密狗、激活码&#xff0c;关于授权相关的问题&#xff0c;我们在此前的文章中也分享了很多&#xff0c;有需要的用户可以翻阅往期的文章进行了解。 有用户反馈&#xff0c;上传激活码文件后&#xff0c;既无报错…