Java 责任链模式

责任链模式

  • 一、什么是责任链模式
  • 二、责任链模式的优势和劣势
    • 2.1 优势
    • 2.2 劣势
  • 三、示例

一、什么是责任链模式

责任链模式定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

可以将它想象成一个管道,请求会顺着管道一段一段被传递,直到被处理。

二、责任链模式的优势和劣势

2.1 优势

  • 解耦
  • 扩展性高
  • 简化链接
  • 分担责任

2.2 劣势

  • 可能请求到最末端也未得到处理
  • 链中程序过多会影响性能
  • 增加了客户端的复杂度

三、示例

我们来一段代码展示一下:

首先我们定义一个抽象类,这个类中定义我们要实现的逻辑的抽象实现和传输逻辑:

public abstract class Handler {//用它打印日志private static final Logger log = LoggerFactory.getLogger(Handler.class);//定义一个要传递的参数private final int num;//参数获取Handler(int num) {this.num = num;}private Handler nextHandler;//链接public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}public final void submit(int i) {if (i == num) {//调用处理方法this.handleLeave(i);//不往下传递请求时打印这个log.info("流程结束!!!");}else if(this.nextHandler == null) {//到最末端仍未处理请求打印这个log.info("责任链中没有处理该数字的程序");}else{this.nextHandler.submit(i);}}protected abstract void handleLeave(int i);}

接着定义三个实现类,实现抽象类中的方法:

实现类 One:

public class One extends Handler{private static final Logger oneLog = LoggerFactory.getLogger(One.class);public One() {super(1);}@Overrideprotected void handleLeave(int leave) {//One 执行的逻辑oneLog.info("打印数字 1");}
}

实现类 Two:

public class Two extends Handler {private static final Logger TwoLog = LoggerFactory.getLogger(Two.class);public Two() {super(2);}@Overrideprotected void handleLeave(int leave) {//Two 执行的逻辑TwoLog.info("打印数字 2");}
}

实现 Three:

public class Three extends Handler {private static final Logger ThreeLog = LoggerFactory.getLogger(Three.class);public Three() {super(3);}@Overrideprotected void handleLeave(int leave) {//Three 执行的逻辑ThreeLog.info("打印数字 3");}
}

最后写一个客户端测试一下:

public class Client {public static void main(String[] args) {// 处理 3Three three = new Three();// 处理 2Two two = new Two();// 处理 1One one = new One();three.setNextHandler(two);two.setNextHandler(one);//提交three.submit(1);three.submit(2);three.submit(3);}
}

运行结果:
在这里插入图片描述
可以看到 One、Two、Three三个实现程序各司其职~

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云效】使用流水线进行应用部署

目录 前言一、部署应用步骤1、创建流水线2、编辑流水线源3、编辑java构建上传4、编辑主机部署 前言 「流水线」,又名「Flow」,是阿里云「云效」产品矩阵中的一款企业级自动化研发交付工具。 它提供了灵活易用的持续集成、持续验证和持续发布功能&#…

ffmpeg学习记录

1、对图片进行裁剪 ffmpeg -i input.jpg -vf cropiw/3:ih:20:0 caijian.jpg PS: crop100:100:12:34 相同效果: cropw100:h100:x12:y34 2、视频增加文字水印 使用drawtext滤镜进行增加水印 参数 类型 说明 text 字符串 文字 textfile 字符串 文字文件 …

基于LLAMA-7B的lora中文指令微调

目录 1. 选用工程2. 中文llama-7b预训练模型下载3. 数据准备4. 开始指令微调5. 模型测试 前言: 系统:ubuntu18.04显卡:GTX3090 - 24G (惨呀,上次还是A100,现在只有3090了~) (本文旨在…

【Python】基于Python的机器学习分类的模型选择:交叉验证和模型质量评估

目录 1 简介2 思路分解与说明3 完整代码 1 简介 最近完成一个工作,就基于一些表格化的数据进行机器学习分类。 由于分类是研究中的关键步骤,所以首先要选择到底哪个模型适合我们的分类任务。 比较传统且经典的选择方法就是用交叉验证。 交叉验证是什么可…

传输控制协议 TCP

文章目录 一、TCP报文格式1.报头格式2.TCP最大段长度 MSS 二、TCP连接建立与释放1.连接建立:三次握手2.报文传输3.连接释放:四次挥手4.保持定时器与时间等待定时器 三、TCP差错重传1.字节流状态分类与滑动窗口(发送)① 滑动窗口两…

Spring Boot中的Elasticsearch自动配置

Spring Boot中的Elasticsearch自动配置 Elasticsearch是一个基于Lucene的分布式全文搜索引擎,它在搜索、分析等方面具有出色的表现。Spring Boot中的Elasticsearch自动配置为我们提供了一种快速集成Elasticsearch的方式,使我们可以在Spring Boot应用程序…

【探索 Kubernetes|作业管理篇 系列 16】离线业务 Job、CronJob

前言 大家好,我是秋意零。 在上一篇中,我们讲解了 DaemonSet 控制器,相信你以及理解了其的工作过程,分为三部。一是,获取所有 Node 节点中的 Pod;二是,判断是否有符合 DaemonSet 管理的 Pod&a…

Linux基础工具|C/C++编译器:gcc/g++的使用

1.基础使用 gcc是专门用来编译C语言的编译器,而g是编译C的编译器(也可以编译C语言,毕竟C语言兼容C)。Linux下gcc默认使用8字节的指针。 下载安装:gcc的安装指令“sudo yum install gcc”(在Linux里大部分…

固态硬盘优化设置

文章目录 前言关闭Windows Search禁用系统保护(不建议)不建议禁用系统保护原因 关闭碎片整理提升固态硬盘速度开启TRIM合理使用固态硬盘的容量正确关机关闭开机自启 前言 提示:这里可以添加本文要记录的大概内容: 电脑配备固态硬…

大数据Doris(五十六):RESOTRE数据恢复

文章目录 RESOTRE数据恢复 一、RESTORE数据恢复原理 二、RESTORE 数据恢复语法 三、RESOTRE数据恢复案例 1、在 Doris 集群中创建 mydb_recover 库 2、执行如下命令恢复数据 3、查看 restore 作业的执行情况 四、注意事项 RESOTRE数据恢复 Doris 支持BACKUP方式将当前…

1.3 Metasploit 生成SSL加密载荷

在本节中,我们将介绍如何通过使用Metasploit生成加密载荷,以隐藏网络特征。前一章节我们已经通过Metasploit生成了一段明文的ShellCode,但明文的网络传输存在安全隐患,因此本节将介绍如何通过生成SSL证书来加密ShellCode&#xff…

BUU [网鼎杯 2020 青龙组]AreUSerialz

BUU [网鼎杯 2020 青龙组]AreUSerialz 先看题目&#xff0c;是个php反序列化。源码如下。 <?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {protected $op;protected $filename; protected $content;function __construct(…