设计模式使用场景实现示例及优缺点(行为型模式——责任链模式)

责任链模式(Chain of Responsibility Pattern)

责任链模式是一种行为设计模式,允许对象将请求沿着处理器链传递,直到一个处理器决定处理该请求为止。这种模式的核心在于解耦发送者和接收者之间的关系,通过多个对象共同处理一个请求,从而避免将一个请求的发送者和接收者耦合在一起。

核心组件

  • Handler(处理器):定义了处理请求的接口,并可实现后继链。
  • ConcreteHandler(具体处理器):具体处理器实现处理请求的接口,如果该处理器不能处理请求,则将其传递给链中的下一个处理器。
  • Client(客户端):通常构造链并向链的首个处理器发送请求。

适用场景

  1. 当有多个对象可以处理一个请求,而发送者不需要明确知道哪一个对象将会处理该请求时
    • 责任链模式使得请求的发送者和接收者解耦。
  2. 当需要动态指定一组对象处理请求时
    • 可以动态地增加或修改处理链。
  3. 当处理请求的顺序重要时
    • 可以控制请求在链中的传递顺序。

实现实例

以客户支持系统为例,不同级别的支持人员处理不同级别的客户请求。

处理器接口(Handler Interface)

Handler 类是一个抽象类,定义了处理请求的方法 handleRequest() 和设置后继处理器的方法 setSuccessor()

public abstract class Handler {protected Handler successor;public void setSuccessor(Handler successor) {this.successor = successor;}public abstract void handleRequest(Request request);
}
  • handleRequest(Request request) 方法用于处理请求,每个具体处理器根据具体条件决定是否处理请求。
  • setSuccessor(Handler successor) 方法用于设置当前处理器的后继处理器,以构建责任链。

具体处理器(Concrete Handler)

具体处理器类继承自 Handler 类,根据特定条件判断是否能够处理请求,如果不能则传递给后继者。

ConcreteHandler1
public class ConcreteHandler1 extends Handler {public void handleRequest(Request request) {if (request.getValue() < 10) { // 判断条件:处理值小于10的请求System.out.println("ConcreteHandler1 handled request " + request.getValue());} else if (successor != null) {successor.handleRequest(request); // 如果无法处理,则传递给后继者}}
}
ConcreteHandler2
public class ConcreteHandler2 extends Handler {public void handleRequest(Request request) {if (request.getValue() >= 10 && request.getValue() < 20) { // 判断条件:处理值在10到20之间的请求System.out.println("ConcreteHandler2 handled request " + request.getValue());} else if (successor != null) {successor.handleRequest(request); // 如果无法处理,则传递给后继者}}
}

客户端代码(Client Code)

客户端代码创建具体处理器实例,并构建责任链,然后发起请求。

public class Client {public static void main(String[] args) {Handler h1 = new ConcreteHandler1();Handler h2 = new ConcreteHandler2();h1.setSuccessor(h2); // 设置责任链Request request = new Request(15); // 创建请求h1.handleRequest(request); // 开始处理请求}
}

在客户端代码中,首先创建了两个具体处理器实例 ConcreteHandler1ConcreteHandler2,然后通过 setSuccessor() 方法将它们连接起来形成责任链。最后创建一个请求对象并调用第一个处理器的 handleRequest() 方法开始处理请求。

责任链模式允许请求在多个对象之间传递,直到找到合适的处理器为止。这种设计方式使得系统更加灵活和可扩展,每个处理器可以独立变化而不影响整个处理流程。

优缺点

优点
  1. 降低耦合度
    • 责任链模式使得一个请求的发送者和接收者之间不必有明确的联系。
  2. 增加了请求处理对象的灵活性
    • 可以动态地添加或修改处理链。
缺点
  1. 请求可能不被处理
    • 如果没有任何处理器处理请求,它可能会在链的末端被丢弃。
  2. 性能问题
    • 在某些情况下,请求在链中的传递可能会导致延迟。

类图

+----------------+           +------------------+
|   Handler      |---------> |   ConcreteHandler|
+----------------+           +------------------+
| + handleRequest()          | + handleRequest()|
| + setSuccessor()           |                  |
+----------------+           +------------------+
|                |           |
+----------------+           ||+-------------------+--------+----------------+|                   |                 |                |
+----------------+ +----------------+ +----------------+ +--------------+
|Handler1         | |ConcreteHandler1| |ConcreteHandler2| | ...          |
+----------------+ +----------------+ +----------------+ +--------------+
| + handleRequest()| | + handleRequest()| | + handleRequest()| | + handleRequest()|
+----------------+ +----------------+ +----------------+ +--------------+

总结

责任链模式提供了一种将请求沿着一条链进行传递的机制,通过这种方式可以解耦请求的发送者和接收者。这种模式特别适用于有多个对象可能处理同一个请求时,允许请求沿链传递直到一个对象处理它为止。

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

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

相关文章

MICS2024|少样本学习、多模态技术以及大语言模型在医学图像处理领域的研究进展|24-07-14

小罗碎碎念 本期推文主题 今天的会议很多主题都集中在大模型、多模态这两个方面&#xff0c;很明显&#xff0c;这两个方向都是目前的研究热点。 所以&#xff0c;我这一期推文会先简单的分析一下秦文健&#xff08;中科院&#xff09;和史淼晶&#xff08;同济大学&#xff09…

解释方法重载和方法重写的区别。然后,给出一个简单的递归方法实例。

方法重载&#xff08;Overloading&#xff09;与方法重写&#xff08;Overriding&#xff09;的区别 在Java编程中&#xff0c;方法重载和方法重写是两个非常重要的概念&#xff0c;它们分别体现了面向对象编程中的多态性&#xff08;Polymorphism&#xff09;的不同方面&…

【STM32开发笔记】搭建VSCode+PyOCD的STM32开发环境

【STM32开发笔记】搭建VSCodePyOCD的STM32开发环境 一、安装软件1.1 安装STM32CubeMX1.2 安装VSCode1.3 安装Arm GNU Toolchain1.4 安装Make for Windows1.5 安装Python1.6 安装PyOCD 二、安装插件2.1 VSCode插件2.2 PyOCD支持包 三、创建项目3.1 创建STM32CubeMX项目3.2 查阅原…

Spring常见问题一:IOC和DI

IOC和DI IOC和DI之间到底是什么关系&#xff1f; 什么是依赖关系&#xff1f;依赖关系会带来什么问题&#xff1f;Spring是怎么来支持依赖注入的&#xff1f; 引言 在现代软件开发中&#xff0c;面向对象编程&#xff08;OOP&#xff09;已经成为主流编程范式。然而&#xff0…

口袋算法的示例

原理 口袋算法是感知器(Perceptron)算法的一种改进。感知器算法是一种线性分类算法,但在训练数据不是线性可分的情况下,它可能无法收敛,即无法找到一个线性分类器来正确分类所有的训练样本。为了解决这个问题,口袋算法引入了一个"口袋"(Pocket),用来存储迄…

java.io.RandomAccessFile 介绍

java.io.RandomAccessFile 是 Java 标准库中提供的一个类&#xff0c;允许对文件进行随机访问读写操作。与 FileInputStream 和 FileOutputStream 不同&#xff0c;RandomAccessFile 可以读取和写入同一个文件&#xff0c;并且可以在文件的任意位置进行读写操作。它既可以作为输…

【Java】字符与字符串

文章目录 1.字符char1.1 编码1.2 转义字符1.3 char的类型转换1.4 字符的比较1.5 Character类 2.String类型2.1 String对象常用的方法&#xff1a;2.2 从控制台读取字符串2.3 从控制台读取字符2.4 字符串的比较2.5 子串和字符2.6 字符串的转化2.7 格式化控制台输出 1.字符char …

IOT 可编程控制系统

IOT&#xff08;物联网&#xff09;可编程控制系统&#xff0c;如GF-MAXCC等&#xff0c;是一种集成了多种先进技术和功能的智能化控制设备&#xff0c;它能够在物联网系统中发挥关键作用&#xff0c;实现对多种设备的集中管理和控制。具体来说&#xff0c;IOT可编程控制系统的…

PyTorch构建一个肺部CT图像分类模型来分辨肺癌

当你有5万个标注的肺部CT DICOM图像数据&#xff0c;并且希望使用PyTorch构建一个肺部CT图像分类模型来分辨肺癌&#xff0c;以下是详细的步骤和示例代码&#xff1a; 数据准备 首先&#xff0c;确保你的数据集被正确分为训练集、验证集和测试集&#xff0c;并且每个图像都有相…

找到并留住最佳员工

找到并留住最佳员工 每个月我都会接到许多猎头的电话,有些猎头比较专业,但绝大多数在我看来与猎头二字还是有很大差距的。 与猎头接触多了,自然也了解了他们的工作,包括操作手法,总体上国内的猎头行业还处在初级阶段。 总结就是“盲目推荐,以量取胜”。 目前现状 许多…

【算法专题】双指针算法之 1089.复写零(力扣)

欢迎来到 CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;双指针算法之 1089.复写零&#xff08;力扣&#xff09; &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算…

2024版彩虹晴天全能知识付费源码+虚拟商城解决方案 含一键搭建视频教程 无授权限制

是一款知识付费平台的核心&#xff0c;更是集虚拟商城、实物交易、代理分销于一体的全能解决方案。 核心亮点&#xff1a; 最新源码&#xff0c;独家首发&#xff1a;经过精心修复与更新&#xff0c;本源码由我们团队亲自把关&#xff0c;确保您获得的是市场上最新鲜、最稳定…

DBA 数据库管理 表管理 数据批量处理。表头约束

表管理 建库 库名命名规则&#xff1a;仅可以使用数字、字母、下划线、不能纯数字 不可使用MySQL命令或特殊字符 库名区分字母大小写 加if not exists 命令避免重名报错 create database if not exists gamedb; 建表 drop database if exists gamedb ; 删表…

常用软件的docker compose安装

简介 Docker Compose 是 Docker 的一个工具&#xff0c;用于定义和管理多容器 Docker 应用。通过使用一个单独的 YAML 文件&#xff0c;您可以定义应用所需的所有服务&#xff0c;然后使用一个简单的命令来启动和运行这些服务。Docker Compose 非常适合于微服务架构或任何需要…

【论文阅读】LLM4GCL: CAN LARGE LANGUAGE MODEL EMPOWER GRAPH CONTRASTIVE LEARNING?

LLM4GCL: CAN LARGE LANGUAGE MODEL EMPOWER GRAPH CONTRASTIVE LEARNING? https://openreview.net/forum?idwxClzZdjqP 图对比学习的重点就是图数据的增强&#xff0c;针对图中节点的表示或者图的结构进行扰动&#xff0c;通过对比学习得到对应的节点表示&#xff0c;以便于…

Kafka基础入门-代码实操

Kafka是基于发布/订阅模式的消息队列&#xff0c;消息的生产和消费都需要指定主题&#xff0c;因此&#xff0c;我们想要实现消息的传递&#xff0c;第一步必选是创建一个主题&#xff08;Topic&#xff09;。下面我们看下在命令行和代码中都是如何创建主题和实现消息的传递的。…

【Linux 配置静态IP】Ubuntu20.04

最近学习网络编程&#xff0c;为了方便学习需要Ubuntu配置静态IP&#xff0c;网上看了好多贴子跟着试了下可以实现&#xff0c;但重启虚拟机后有时就无法连接&#xff0c;总之各种各样问题&#xff1b;相关的配置方法也比较凌乱&#xff0c;有用netplan 或者 ifupdown ,笔者简单…

数据库崩溃时事务的恢复机制

在数据库管理系统中&#xff0c;确保数据的一致性和完整性是至关重要的。特别是在面对系统崩溃或意外中断时&#xff0c;如何有效地恢复事务状态成为了一个关键问题。MySQL的InnoDB存储引擎通过引入REDO日志和UNDO日志机制&#xff0c;巧妙地解决了这一问题&#xff0c;确保了事…

C++知识点:C和C++(自用)

C和C 1.类和结构体的关系&#xff1a;2.面向对象和面向过程3.头文件和标准命名空间4.cin和cout5. const在C中和C中的区别6.const全局作用域7 new和delete8 内联函数9 函数重载10. 函数重载的匹配 引用&#xff1a; [1]C语言中文网 1.类和结构体的关系&#xff1a; 类是结构体的…

Linux bash: yum-config-manager: command not found的解决方法

yum-config-manager简介 Linux yum-config-manager 是一个用于管理 YUM 仓库配置的工具&#xff0c;它允许用户启用、禁用、添加或删除 YUM 仓库。这个命令在基于 Red Hat 的系统中广泛使用&#xff0c;比如 CentOS 和 Fedora。 可能原因 用户可能未安装 yum-utils 包&#…