设计模式之 责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,旨在将多个处理对象通过链式结构连接起来,形成一条处理请求的链条。每个处理对象都有机会处理请求,或者将请求传递给链中的下一个对象。这样,客户端不需要知道哪个具体的对象会处理请求,而是通过责任链的结构来自动地传递和处理请求。

责任链模式的核心思想是将处理请求的职责链式连接起来,由链中的对象依次处理请求,直到某个对象处理完请求为止。

一、责任链模式的组成部分

责任链模式通常包含以下几个角色:

  1. Handler(处理者接口)

    定义了一个接口,声明了处理请求的方法。在该方法中,处理者通常会选择是否处理请求。如果能够处理,则处理请求,否则将请求转发给下一个处理者。
  2. ConcreteHandler(具体处理者)

    实现了Handler接口,定义了具体的处理逻辑。如果该对象能够处理请求,则直接处理;如果不能处理,则将请求传递给下一个处理者。
  3. Client(客户端)

    负责初始化责任链,并向链中的第一个处理者发送请求。客户端不需要关心请求是由哪一个处理者来完成的。
  4. Chain(责任链)

    由多个处理者对象组成。每个处理者对象都有一个指向下一个处理者的引用。请求会沿着责任链逐一传递,直到有处理者处理请求或者链的末尾。
二、责任链模式的工作原理

责任链模式的工作原理是将多个处理对象组成链条,每个处理对象知道下一个处理对象,并负责将请求转发给下一个对象。每个处理者对象会判断自己是否能够处理请求,如果可以处理请求,则执行相应的操作;如果不可以处理请求,则将请求转发给责任链中的下一个处理者。

这种设计模式非常适合处理多个处理条件之间的连贯流程,例如:请求审批流程、日志记录、事件处理等。

三、责任链模式的代码示例
  • 定义抽象处理者
    public abstract class Handler{protected Handler nextHandler;public abstract void setNext(Handler handler);public abstract void handleRequest(int request);
    }
  • 定义具体的处理者
    public class GroupHandler extends Handler{@Overridepublic void setNext(Handler handler) {nextHandler = handler;}@Overridepublic void handleRequest(int request) {if (request < 3){System.out.println("小组长批准"+request+"天假");}else {nextHandler.handleRequest(request);}}
    }
    
    public class Manager extends Handler{@Overridepublic void setNext(Handler handler) {nextHandler = handler;}@Overridepublic void handleRequest(int request) {if (request < 5){System.out.println("经理批准"+request+"天假");}else {nextHandler.handleRequest(request);}}
    }
    
    public class GeneralManager extends Handler{@Overridepublic void setNext(Handler handler) {throw new RuntimeException("总经理是最高职位");}@Overridepublic void handleRequest(int request) {if (request < 10){System.out.println("总经理批准"+request+"天假");}}
    }
    
  • 客户端代码
    public class Client {public static void main(String[] args) {GroupHandler groupHandler = new GroupHandler();Manager manager = new Manager();GeneralManager generalManager = new GeneralManager();groupHandler.setNext(manager);manager.setNext(generalManager);//请四天假groupHandler.handleRequest(4);}
    }
  • 运行结果
四、责任链模式的优缺点
优点:
  1. 解耦请求发送者与处理者:客户端不需要知道哪个处理者会处理请求,只需要发起请求即可,责任链的结构内部决定了请求的处理流程。
  2. 降低了对象之间的耦合度:每个处理者仅仅负责判断请求是否能处理,并将无法处理的请求传递给下一个处理者。这样,系统中的对象之间的依赖关系大大减少。
  3. 增强灵活性和扩展性:责任链中的每个处理者都可以独立扩展,可以通过增加新的处理者来修改或扩展请求处理的逻辑,而不需要修改现有的代码。
  4. 动态控制请求的处理流程:请求的处理可以动态改变,可以控制责任链的顺序,或者在运行时选择是否将请求传递给下一个处理者。
缺点:
  1. 性能开销:如果责任链较长,且每个请求都需要经过多个处理者,可能会导致性能问题,因为每个请求都需要被逐个检查和转发。
  2. 调试难度:由于请求可能会经过多个处理者,这种链式的调用可能会增加调试的难度,尤其是在请求的处理过程非常复杂时,调试和跟踪问题可能会变得更加困难。
  3. 请求处理不明确:如果没有明确的设计,责任链中的某个请求可能会一直传递下去,直到链的最后也没有处理,从而可能导致请求的处理不及时,或者被忽略。
五、责任链模式的应用场景

责任链模式适用于以下几种场景:

  1. 多层次的请求处理

    当有多个处理对象需要依次处理同一个请求时,责任链模式非常适用。例如,权限验证、审批流程等需要经过多个步骤的处理。
  2. 动态改变请求的处理顺序

    通过灵活配置责任链,可以动态改变请求的处理顺序,而无需修改客户端的代码。例如,在一些复杂的系统中,根据不同的配置,可能会根据不同的规则选择不同的处理链。
  3. 日志处理系统

    责任链模式非常适合用于日志系统,不同的日志处理器(如文件日志、数据库日志、网络日志等)可以按顺序处理日志请求。如果一个处理器无法处理日志,可以将其传递给下一个处理器。
  4. 事件处理系统

    在事件驱动的系统中,可以使用责任链模式来分发和处理事件。事件可以依次传递给多个处理者,每个处理者可以根据自己的条件决定是否处理该事件。
  5. 权限验证

    • 在系统中的权限控制过程中,可能会有多个权限验证步骤,责任链模式可以通过设置多个权限验证处理者来实现逐步验证,直到请求满足某个权限要求。

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

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

相关文章

Flink-Source的使用

Data Sources 是什么呢&#xff1f;就字面意思其实就可以知道&#xff1a;数据来源。 Flink 做为一款流式计算框架&#xff0c;它可用来做批处理&#xff0c;也可以用来做流处理&#xff0c;这个 Data Sources 就是数据的来源地。 flink在批/流处理中常见的source主要有两大类…

python开发之Linux

文章目录 1. 基础2. 进阶链接压缩/解压缩 文件权限用户远程操作编辑文件软件安装 1. 基础 # 查看当前目录下文件 ls# 查看当前目录 pwd# 清除界面内容 clear# 切换目录 cd# 创建目录 mkdir# 创建文件 touch 文件 vi 文件# 强制删除 rm -rf # 复制文件 cp 复制文件 复制文件路径…

【数据结构】七种常用排序总结

一、七种排序及其讲解 以下为七种排序的讲解&#xff1a; 【数据结构】插入排序——直接插入排序 和 希尔排序 【数据结构】选择排序——选择排序 和 堆排序 【数据结构】交换排序——冒泡排序 和 快速排序 【数据结构】归并排序 —— 递归及非递归解决归并排序 二、排序的…

计算机网络(14)ip地址超详解

先看图&#xff1a; 注意看第三列蓝色标注的点不会改变&#xff0c;A类地址第一个比特只会是0&#xff0c;B类是10&#xff0c;C类是110&#xff0c;D类是1110&#xff0c;E类是1111. IPv4地址根据其用途和网络规模的不同&#xff0c;分为五个主要类别&#xff08;A、B、C、D、…

HashMap底层原理

jdk1.8之后hashmap底层结构 jdk1.8之后&#xff0c;是哈希表数据结构&#xff0c;也可以说是数组链表或红黑树&#xff0c;下图是没有添加数据的一个hashmap。 现在开始添加数据&#xff0c;看下面具体步骤 put操作 如下&#xff0c;我们来简单看看hashmap的put源码&#xff…

【GD32】(三) ISP基本使用

0 前言 有一块GD32的板子不知道为啥用着用着就下载不了程序了&#xff0c;没办法&#xff0c;只能另寻他法。作为STM32的平替&#xff0c;GD32的功能和STM32基本是一致的&#xff0c;所以也可以使用ISP来下载程序。于是就开始复活这块板子。 1 BOOT模式 对于熟悉STM32开发的人…

摄像机视频分析软件下载LiteAIServer视频智能分析平台玩手机打电话检测算法技术的实现

随着科技的不断进步&#xff0c;摄像机视频分析软件的发展已经为我们的生活带来了许多便捷。其中&#xff0c;LiteAIServer视频智能分析平台的玩手机打电话检测算法技术尤为突出&#xff0c;它利用先进的图像处理和人工智能技术&#xff0c;能够自动识别并监控视频中的玩手机或…

推荐几个 VSCode 流程图工具

Visual Studio Code&#xff08;简称VSCode&#xff09;是一个由微软开发的免费、开源的代码编辑器。 VSCode 发布于 2015 年&#xff0c;而且很快就成为开发者社区中广受欢迎的开发工具。 VSCode 可用于 Windows、macOS 和 Linux 等操作系统。 VSCode 拥有一个庞大的扩展市…

学习Prompt Turning

传统的微调因为代价很高&#xff0c;而且一旦权重很大&#xff0c;这种fine 微微的意思是调不动模型的&#xff0c;所以需要这种提示词调 mindnlp直接有 peft config peft_config PromptTuningConfig(task_type“SEQ_CLS”, num_virtual_tokens10) 方便我们进行prompt tunin…

2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略(详细解题思路)

在当下&#xff0c; 日益发展的时代&#xff0c;宠物的数量应该均为稳步上升&#xff0c;在美国出现了下降的趋势&#xff0c; 中国 2019-2020 年也下降&#xff0c;这部分变化可能与疫情相关。需要对该部分进行必要的解释说明。 问题 1: 基于附件 1 中的数据及您的团队收集的额…

若依-一个请求中返回多个表的信息

背景 主表是点位表关联子表 需要知道对应 合作商的信息关联子表 需要直到对应 区域的信息关联子表 需要直到对应 设备数量 实现的方案 关联实体相关的标签

AWTK-WEB 快速入门(1) - C 语言应用程序

先安装 AWTK Designer 用 AWTK Designer 新建一个应用程序 2.1. 新建应用程序 这里假设应用程序的名称为 AwtkApplicationC&#xff0c;后面会用到&#xff0c;如果使用其它名称&#xff0c;后面要做相应修改。 在窗口上放置一个按钮将按钮的名称改为 “close”将按钮的文本改…

客户流失分析综述

引言 客户流失这个术语通常用来描述在特定时间或合同期内停止与公司进行业务往来的客户倾向性[1]。传统上&#xff0c;关于客户流失的研究始于客户关系管理&#xff08;CRM&#xff09;[2]。在运营服务时&#xff0c;防止客户流失至关重要。过去&#xff0c;客户获取相对于流失…

PDF内容提取,MinerU使用

准备环境 # python 3.10 python3 -m pip install huggingface_hub python3 -m pip install modelscope python3 -m pip install -U magic-pdf[full] --extra-index-url https://wheels.myhloli.com下载需要的模型 import json import osimport requests from huggingface_hub…

Kafka 分区分配及再平衡策略深度解析与消费者事务和数据积压的简单介绍

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

【2024APMCM亚太赛A题】完整参考论文与代码分享

A题 一、问题重述二、问题分析问题一&#xff1a;水下图像分类问题二&#xff1a;退化原因建模问题三&#xff1a;针对单一退化的图像增强方法问题四&#xff1a;复杂场景的综合增强模型问题五&#xff1a;针对性增强与综合增强的比较 三、问题假设退化特征独立性假设物理模型普…

数据结构(初阶6)---二叉树(遍历——递归的艺术)(详解)

二叉树的遍历与练习 一.二叉树的基本遍历形式1.前序遍历(深度优先遍历)2.中序遍历(深度优先遍历)3.后序遍历(深度优先遍历)4.层序遍历&#xff01;&#xff01;(广度优先遍历) 二.二叉树的leetcode小练习1.判断平衡二叉树1&#xff09;正常解法2&#xff09;优化解法 2.对称二叉…

ChatGPT 与其他 AI 技术在短视频营销中的技术应用与协同策略

摘要&#xff1a; 本文深入探讨了 ChatGPT 及其他 AI 技术在短视频营销中的应用。从技术层面剖析了这些技术如何助力短视频内容创作、个性化推荐、用户互动以及营销效果评估等多方面&#xff0c;通过具体方法分析、数据引用与大模型工具介绍&#xff0c;旨在为短视频营销领域提…

先安装Ubuntu20.04,再安装win10实现双系统

准备 一个刻录好Ubuntu20.04系统u盘一个刻录了Ventory的U盘&#xff0c;其中有Windows10的iso系统文件。Ventory参考Gparted分区软件&#xff0c;用于腾出一块硬盘空间安装Win10 过程 给win10腾出一块硬盘空间&#xff0c;设置为NTFS格式 Ubuntu系统中其实已经有GParted软件…

数据结构------树(Java语言描述)

一、树的基本概念 树是一种非线性的数据结构&#xff0c;它由节点组成&#xff0c;有一个特定的节点称为根节点&#xff0c;其余节点可以分为多个互不相交的子树。 树中的节点具有以下特点&#xff1a; 1.每个节点有零个或多个子节点。 2.除了根节点外&#xff0c;每个节点…