责任链模式(二十六)

news2024/10/7 6:43:16

相信自己,请一定要相信自己

上一章简单介绍了策略模式(二十五), 如果没有看过, 请观看上一章

一. 责任链模式

引用 菜鸟教程里面的责任链模式介绍: https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。

这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。

如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

一.一 介绍

意图: 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,
并且沿着这条链传递请求,直到有对象处理它为止。

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

何时使用: 在处理消息的时候以过滤很多道。

如何解决: 拦截的类都实现统一接口。

关键代码: Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,
向谁传递之前 set 进去。

应用实例:

1、红楼梦中的"击鼓传花"。

2、JS 中的事件冒泡。

3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。

优点:

1、降低耦合度。它将请求的发送者和接收者解耦。

2、简化了对象。使得对象不需要知道链的结构。

3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。

4、增加新的请求处理类很方便。

缺点:

1、不能保证请求一定被接收。

2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。

3、可能不容易观察运行时的特征,有碍于除错。

使用场景:

1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

3、可动态指定一组对象处理请求。

注意事项: 在 JAVA WEB 中遇到很多应用。


组成角色具体关系
请求 (Request)BuyAudit含有很多属性,表示一个请求
抽象的处理者(Handler)Approver处理它自己负责的请求,可以访问它的后继者(即下一个处理者),
如果 可以处理当前请求,则处理,否则就将该请求交个 后继者去处理,从而形成一个职责链
具体处理者(ConcreteHandler)ZhuRen, YuanZhang内部会持有一个抽象角色的引用,给客户端调用

image-20230615204310121

二. 责任链实例

二.一 请求 BuyAudit

@Data
public class BuyAudit {
    private Integer id;
    private Float price;
}

二.二 抽象处理者 Approver

@Data
public abstract class Approver {
    private Approver next;
    private String name;

    public Approver (String name) {
        this.name = name;
    }

    public abstract void processRequest (BuyAudit buyAudit) ;

}

二.三 具体处理者

二.三.一 主任 ZhuRen

@Slf4j
public class ZhuRen extends Approver{
    public ZhuRen (String name) {
        super(name);
    }
    @Override
    public void processRequest(BuyAudit buyAudit) {
        if (buyAudit.getPrice() < 5000) {
            log.info("请求{} 金额是 {} 被用户 {} 处理", buyAudit.getId(),buyAudit.getPrice(),this.getName());
        }else {
            // 交给下一个人进行处理
            log.info("用户 {} 无法处理这么大的金额申请,往上抛出 ", this.getName());
            super.getNext().processRequest(buyAudit);
        }
    }
}

二.三.二 院长 YuanZhang

@Slf4j
public class YuanZhang extends Approver{
    public YuanZhang(String name) {
        super(name);
    }
    @Override
    public void processRequest(BuyAudit buyAudit) {
        if (buyAudit.getPrice() < 10000) {
            log.info("请求{} 金额是 {} 被用户 {} 处理", buyAudit.getId(),buyAudit.getPrice(),this.getName());
        }else {
            // 交给下一个人进行处理
            log.info("用户 {} 无法处理这么大的金额申请,往上抛出 ", this.getName());
            super.getNext().processRequest(buyAudit);
        }
    }
}

二.三.三 副校长 FuXiaoZhange

@Slf4j
public class FuXiaoZhange extends Approver{
    public FuXiaoZhange(String name) {
        super(name);
    }
    @Override
    public void processRequest(BuyAudit buyAudit) {
        if (buyAudit.getPrice() < 30000) {
            log.info("请求{} 金额是 {} 被用户 {} 处理", buyAudit.getId(),buyAudit.getPrice(),this.getName());
        }else {
            // 交给下一个人进行处理
            log.info("用户 {} 无法处理这么大的金额申请,往上抛出 ", this.getName());
            super.getNext().processRequest(buyAudit);
        }
    }
}

二.三.四 校长 XiaoZhange

@Slf4j
public class XiaoZhange extends Approver{
    public XiaoZhange(String name) {
        super(name);
    }
    @Override
    public void processRequest(BuyAudit buyAudit) {
        log.info("请求{} 金额是 {} 被用户 {} 处理", buyAudit.getId(),buyAudit.getPrice(),this.getName());
    }
}

二.四 客户端调用

@Test
    public void oneTest() {
        // 定义责任链用户
        Approver zhuRen = new ZhuRen("主任");
        Approver yuanZhang = new YuanZhang("院长");
        Approver fuXiaoZhang = new FuXiaoZhange("副校长");
        Approver xiaoZhange = new XiaoZhange("校长");

        zhuRen.setNext(yuanZhang);
        yuanZhang.setNext(fuXiaoZhang);
        fuXiaoZhang.setNext(xiaoZhange);

        // 定义一个请求
        BuyAudit buyAudit = new BuyAudit();
        buyAudit.setId(1);
        buyAudit.setPrice(15000.0f);
        log.info(">>> 处理 15000 的请求申请");
        //从最低的开始进行处理请求
        zhuRen.processRequest(buyAudit);
        buyAudit.setPrice(45000.0f);
        log.info(">>> 处理 45000 的请求申请");
        zhuRen.processRequest(buyAudit);
    }

image-20230615205041821


本章节的代码放置在 github 上:


https://github.com/yuejianli/DesignPattern/tree/develop/Chain


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

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

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

相关文章

Science Advance||个体动态脑中鲁棒的大脑状态

文章目录 个体化动态方法&#xff08;INSCAPE 方法&#xff09;&#xff1a;&#xff08;A&#xff09;生成脑共同激活状态的组模板&#xff1a;&#xff08;B&#xff09;个体水平分析&#xff1a; 不同的大脑状态有特定的协同激活模式&#xff08;coactivation patterns&…

ai写作怎么搞?我来教你几招

在当今信息化时代&#xff0c;ai技术的发展已经进入到了一个全新的阶段&#xff0c;越来越多的人们开始运用ai技术进行写作。作为一种创新性的工具&#xff0c;ai写作已经成为了许多企业和个人写作必不可少的工具之一。但是&#xff0c;对于初学者来说&#xff0c;如何快速上手…

【网络技术】NAT是什么?它的工作原理是什么?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、NAT是什么&#xff1f; 二、NAT的实现方式&#xff08;三种&#xff09; 1、静态转换&#xff08;Static Nat&#xff09; 2、动…

css line-height

项目中看到 line-height&#xff1a;1 所以来总结一下 line-height 属性。 line-height 定义 line-height 属性设置行间的距离&#xff08;行高&#xff09;。 line-height 不允许使用负值。 属性可能的值 值描述normal默认。设置合理的行间距。number设置数字&#xff0…

手机技巧:安卓微信 8.0.38 内测版本功能一览

2023年6月14号安卓版本的微信8.0.38又开始内测了&#xff0c;今天就赶紧下载体验一下&#xff0c;下面就来给大家一一介绍&#xff0c;本次安卓微信内测版本功能更新&#xff0c;感兴趣的朋友可以文末下载体验一下&#xff01; 首先看一下官方的更新内容&#xff1a; 本次更新…

【Axure 教程】中继器(基础篇)

一、初识中继器 中继器是 Axure 中一个比较高阶的应用&#xff0c;它可以让我们在纯静态网页中模拟出类似带有后台数据交互的增删改查的效果&#xff0c;虽然它没有真正意义上帮我们存储任何的数据&#xff0c;但是当我们在一次项目体验过程中&#xff0c;它却可以给我们带来更…

字节跳动提出高性能 transformer 推理库,获 IPDPS 2023 最佳论文奖

动手点关注 干货不迷路 字节跳动与英伟达, 加州大学河滨分校联合发表的论文 《ByteTransformer: A High-Performance Transformer Boosted for Variable-Length》在第 37 届 IEEE 国际并行和分布式处理大会&#xff08;IPDPS 2023&#xff09;中&#xff0c;从 396 篇投稿中脱颖…

广东省高校人工智能产教融合院长研讨会召开,校企协同探索AI教育新范式

为深化产教融合、促进校企合作&#xff0c;着力推进人工智能产业和高校人才培养体系相融合&#xff0c;深入探讨校企合作、产教融合与课程建设规划等事宜&#xff0c;2023年6月9日下午&#xff0c;百度飞桨联合广东省计算机学会、华南理工大学计算机科学与工程学院、荔峰科技&a…

这世界好神奇,我们其实并不了解自己的身体

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 文案 / 粒粒 产品统筹 / bobo 场地支持 / 声湃轩北京站 这是一次突发奇想的天马行空&#xff0c;三个人猝不及防地坐下来大开脑洞&#xff0c;从诗词歌赋聊到人生哲学&#xff…

CVPR 2023 | 美团技术团队精选论文解读

本文精选了美团技术团队被CVPR 2023收录的8篇论文进行解读。这些论文既有自监督学习、领域自适应、联邦学习等通用学习范式方面的技术迭代&#xff0c;也涉及目标检测、跟踪、分割、Low-level Vision等典型视觉任务的性能&#xff0c;体现了美团在基础通用技术和垂直领域技术上…

HotSpot虚拟机对象探索与OutOfMemoryError异常

HotSpot虚拟机对象探索与OutOfMemoryError异常 1.HotSpot虚拟机对象探索 1.1对象的创建 不是一直有一个笑话,别人问程序员有没有对象,程序员会说我没有对象,但是我可以new一个出来 这里就可以判断他学过c或者java等语言 在java中对象的创建一般我们都是通过new来创建的,但…

MyBatis01

ORM&#xff1a;对象关系映射 O&#xff08;Object&#xff09;&#xff1a;Java虚拟机中的Java对象 R&#xff08;Relational&#xff09;&#xff1a;关系型数据库 M&#xff08;Mapping&#xff09;&#xff1a;将Java虚拟机中的Java对象映射到数据库表中一行记录&#xff0…

【王道·操作系统】第三章 内存管理

一、内存管理 1.1 内存的基础知识 内存可存放数据&#xff0c;程序执行前需要先放到内存中才能被CPU处理——缓和CPU与硬盘之间的速度矛盾内存地址从0开始&#xff0c;每个地址对应一个存储单元 按字节编址&#xff1a;每个存储单元大小为1字节(B)&#xff0c;即8个二进制位按…

【Spring Cloud系列】- Eureka使用详解

【Spring Cloud系列】- Eureka使用详解 文章目录 【Spring Cloud系列】- Eureka使用详解一、概述二、Eureka简介三、Eureka结构与作用Eureka结构图Eureka采用CS&#xff08;Client/Server,客户端/服务器&#xff09;架构&#xff0c;它包括以下两大组件 四、Eureka集群及与应用…

梁宁:为什么中国没有像 ChatGPT 和 Vision Pro 这样的创新产品?

6 月 10 日&#xff0c;产品战略专家梁宁和图灵联合创始人刘江围绕“ ChatGPT 真需求”主题进行直播对谈。 梁宁&#xff0c;产品战略专家&#xff0c;曾任湖畔大学产品模块学术主任&#xff0c;联想、腾讯高管&#xff0c;CNET集团副总裁。 工作经历横跨 BAT&#xff0c;与美团…

第14届蓝桥杯Scratch(中级)国赛真题解析2023.5.28

第14届蓝桥杯Scratch(中级)国赛真题解析2023.5.28 一:选择题(50分)第 1 题 单选题(10分) 运行以下程序后,角色说出的数是 ( C )。 *选择题严禁使用程序验证,选择题不答或答错都不扣分 A.150 B.200 C.300 D.600第 2 题 单选题(10分) 对以下程序效果描述完全正确的是 …

【JUC进阶】01. Synchroized实现原理

目录 1、前言 2、Synchronized使用 2.1、对象锁&#xff08;Instance Lock&#xff09; 2.2、类锁&#xff08;Class Lock&#xff09; 2.3、方法锁&#xff08;Method Lock&#xff09; 3、原理分析 3.1、monitor对象 3.2、monitorenter 3.3、monitorexit 3.4、对象…

库克和马斯克之后,比尔盖茨访华,美企认识到中国市场不可替代

微软创始人比尔盖茨已到达了中国&#xff0c;这是美国苹果CEO库克、特斯拉CEO马斯克之后访华的又一位美国重要企业家&#xff0c;那么美国企业家陆续访华是为了什么呢&#xff1f; 一、美企连遭挫折 苹果一季度的业绩显示营收、利润均下滑了个位数&#xff0c;但是苹果看到了隐…

AIGC 加持 Cocos,游戏开发需要几步?

近日&#xff0c;游戏行业知名的 B2B 大会 WN 2023 大会于土耳其首都伊斯坦布尔顺利举办。本次大会邀请了来自全球的游戏开发商、媒体、发行商、分发平台等行业决策者&#xff0c;共同探讨游戏行业未来发展态势&#xff0c;进一步拓展业务&#xff0c;并在世界范围内寻找新的合…

【力扣刷题 | 第十天】347.前k个高频元素 227 简单计算器

前言&#xff1a; 本篇将是最后一篇我们利用栈与队列来解决力扣问题&#xff0c;在下文我们将进入到数这一章&#xff0c;相对应的【夜深人静讲数据结构与算法】专栏中树也会及时更新。 347. 前 K 个高频元素 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums 和…