设计模式--责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,其主要目的是将请求的发送者和接收者解耦,使得多个对象都有机会处理请求。通过将这些对象连接成一条链,沿链传递请求,直到某个对象处理该请求为止。

关键概念

  1. 处理者(Handler):定义一个处理请求的接口,并且可以选择将请求传递给链中的下一个处理者。

  2. 具体处理者(ConcreteHandler):实现了处理请求的具体逻辑,并决定是否处理请求。如果不能处理,则将请求传递给链中的下一个处理者。

  3. 客户端(Client):向链中的第一个处理者发送请求,处理者会沿链传递请求,直到找到合适的处理者。

结构

  1. Handler(处理者):定义处理请求的接口,并声明一个后继链。

    public abstract class Handler {
        protected Handler successor;
    
        public void setSuccessor(Handler successor) {
            this.successor = successor;
        }
    
        public abstract void handleRequest(String request);
    }
    
  2. ConcreteHandler(具体处理者):实现具体的处理请求的逻辑,并决定是否处理请求或将请求传递给链中的下一个处理者。

    public class ConcreteHandlerA extends Handler {
        @Override
        public void handleRequest(String request) {
            if (request.equals("A")) {
                System.out.println("Handler A processed request: " + request);
            } else if (successor != null) {
                successor.handleRequest(request);
            }
        }
    }
    
    public class ConcreteHandlerB extends Handler {
        @Override
        public void handleRequest(String request) {
            if (request.equals("B")) {
                System.out.println("Handler B processed request: " + request);
            } else if (successor != null) {
                successor.handleRequest(request);
            }
        }
    }
    
  3. Client(客户端):创建处理者链,并发送请求。

    public class ChainOfResponsibilityDemo {
        public static void main(String[] args) {
            Handler handlerA = new ConcreteHandlerA();
            Handler handlerB = new ConcreteHandlerB();
            handlerA.setSuccessor(handlerB);
    
            handlerA.handleRequest("A");
            handlerA.handleRequest("B");
            handlerA.handleRequest("C");
        }
    }
    

优点

  1. 解耦请求发送者和处理者:请求的发送者和处理者之间没有直接的依赖关系,请求可以沿链传递,直到找到合适的处理者。

  2. 动态处理请求:可以根据需要动态地添加或修改链中的处理者,提供了很好的灵活性。

  3. 链的灵活性:链中的处理者可以根据请求的内容动态决定是否处理请求或将请求传递给下一个处理者。

缺点

  1. 处理链的配置复杂:链的配置可能变得复杂,特别是当处理者链较长或处理者之间的关系较复杂时。

  2. 性能问题:在请求沿链传递的过程中,如果链很长,可能会影响系统的性能。

  3. 难以追踪请求处理:由于请求可能被多个处理者处理,可能会导致请求的处理过程难以追踪和调试。

应用场景

  • 日志处理:在日志系统中,可以创建多个处理者(如文件日志、控制台日志、数据库日志等),将日志请求沿链传递,直到找到合适的处理者。
  • 用户请求处理:在Web应用中,可以使用责任链模式处理用户的请求,例如权限验证、请求过滤、业务逻辑处理等。
  • 事件处理:在GUI系统中,事件处理可以使用责任链模式,将事件沿链传递,直到找到合适的事件处理器。

总结

责任链模式通过将请求沿链传递,提供了一种灵活且可扩展的请求处理机制。它解耦了请求的发送者和处理者,使得系统的设计更加灵活和可维护。尽管处理链的配置和性能可能成为挑战,但其在处理复杂请求和动态请求处理方面具有很大的优势。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django ORM(多表)

文章目录 前言一、关联关系模型二、一对多写入数据二、多对多写入数据二、跨表查询1.查找test 标签的文章2.查找作者名为 test 的文章及标签 三、跨表删除 前言 表与表之间的关系可分为以下三种: 一对一: 一对一关系表示一个模型的每个实例与另一个模型的每个实例…

【字符函数】strcpy函数(字符串复制函数)+strcat函数(字符串追加)+strcmp函数(字符串比较)【笔记】

1.复制函数--------------strcpy函数 函数使用 char*strcpy(char* destination, const char* source) strcpy函数用于拷贝字符串,即将一个字符串中的内容拷贝到另一个字符串中(会覆盖原字符串内容)。它的参数是两个指…

Mysql梳理6——order by排序

目录 6 order by排序 6.1 排序数据 6.2 单列排序 6.3 多行排列 6 order by排序 6.1 排序数据 使用ORDER BY字句排序 ASC(ascend):升序DESC(descend):降序 ORDER BY子句在SELECT语句的结尾 6.2 单列排序 如果没有使用排序操作,默认…

【HarmonyOS NEXT】DevEco快速实现真机截屏,并保存到电脑

点日志点照机图标选一个路径保存图片在ide中右键图片,点复制电脑随便找个位置保存图片https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-screenshot-V5

1-2.Jetpack 之 Navigation 跳转编码模板

一、Navigation 1、Navigation 概述 Navigation 是 Jetpack 中的一个重要成员,它主要是结合导航图(Navigation Graph)来控制和简化 Fragment 之间的导航,即往哪里走,该怎么走 2、Navigate 引入 在模块级 build.gra…

Datawhale------Tiny-universe学习笔记——Qwen(1)

1. Qwen整体介绍 对于一个完全没接触过大模型的小白来说,猛一听这个名字首先会一懵:Qwen是啥。这里首先解答一下这个问题。下面是官网给出介绍:Qwen是阿里巴巴集团Qwen团队研发的大语言模型和大型多模态模型系列。其实随着大模型领域的发展&a…

全同台加密综述

文章目录 一、FHE的定义与性质1、核心算法2、性质 二、构造思想三、全同态加密研究进展1、支持部分同态的 Pre-FHE 方案2、基于理想格的 第1代 FHE方案3、基于LWE的 第2代 FHE方案3、基于近似特征向量的 第3代 FHE方案4、支持浮点数运算的 第4代 FHE方案5、其他 FHE方案5.1、基…

数字化时代,住宅代理是怎样为企业赋能的?

在数字化时代,企业的发展也面临着转型,一方面是未知的挑战,一方面是不可多得的机遇。如何在全球市场中保持竞争力是企业要认真思考的问题。如果说主动寻找出路太过冒险,那不妨试试内省式的自我管理革新。代理服务器是一种中介服务…

TI DSP下载器XDS100 V2.0无法使用问题

前言 TI DSP下载器XDS100 V2.0用着用着会突然报Error,特别是你想要用Code Composer Studio烧录下载程序的时候 查看设备管理器,发现XDS100 V2.0的设备端口莫名其妙消失了 问了淘宝的厂家,他说TI的开发板信号可能会导致调试器通信信号中断&a…

软件安全最佳实践:首先关注的地方

尽管组织拥有大量可用的工具,但应用程序安全性仍然不足。 最近的数据显示,在过去四到五年中,软件供应链攻击同比增长了 600-700%,超过一半的美国企业在过去 12 个月中遭受过某种形式的软件供应链攻击。 为何应用程序安全工作未…

相亲交易系统源码详解与开发指南

随着互联网技术的发展,越来越多的传统行业开始寻求线上转型,其中就包括婚恋服务。传统的相亲方式已经不能满足现代人快节奏的生活需求,因此,开发一款基于Web的相亲交易系统显得尤为重要开发者h17711347205。本文将详细介绍如何使用…

WEB攻防-JavaWweb项目JWT身份攻击组件安全访问控制

知识点: 1、JavaWeb常见安全及代码逻辑; 2、目录遍历&身份验证&逻辑&JWT; 3、访问控制&安全组件&越权&三方组件; 演示案例: JavaWeb-WebGoat8靶场搭建使用 安全问题-目录遍历&身份认…

Ubuntu20.04 搜索不到任何蓝牙设备

电脑信息 联想扬天YangTianT4900k 问题描述 打开蓝牙之后,一直转圈,搜索不到任何蓝牙设备 排查 dmesg | grep -i blue 有如下错误: Bluetooth: hci0: RTL: unknown IC info, lmp subver 8852, hci rev 000b, hci ver 000b lsusb 芯片型号如…

imo云办公室 Imo_DownLoadUI.php 任意文件下载漏洞复现

0x01 漏洞描述: imo云办公室由上海易睦网络科技有限公司于2007年创立,总部位于上海,imo云办公室管理运营企业即时通讯平台imo,包括对imo的在线支持,故障处理,客户服务等,对imo进行持续研发&…

Nexpose 6.6.269 发布下载,新增功能概览

Nexpose 6.6.269 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Sep 11, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.or…

web - JavaScript

JavaScript 1,JavaScript简介 JavaScript 是一门跨平台、面向对象的脚本语言,而Java语言也是跨平台的、面向对象的语言,只不过Java是编译语言,是需要编译成字节码文件才能运行的;JavaScript是脚本语言,不…

Mac 上哪个剪切板增强工具比较好用? 好用剪切板工具推荐

在日常文字编辑中,我们经常需要重复使用复制的内容。然而,新内容一旦复制,旧内容就会被覆盖。因此,选择一款易用高效的剪贴板工具成为了许多人的需求。本文整理了一些适用于 macOS 系统的优秀剪贴板增强工具,欢迎大家下…

人工智能-大语言模型-微调技术-LoRA及背后原理简介

1. 《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS》 LORA: 大型语言模型的低秩适应 摘要: 随着大规模预训练模型的发展,全参数微调变得越来越不可行。本文提出了一种名为LoRA(低秩适应)的方法,通过在Transf…

用JS给官方电子课本扩展个下载功能

为了方便学生、老师和家长,官方提供了几乎所有在用的正版电子课本,由于没有下载功能,只能在线看,有点不方便。 为了更方便使用,用JS外挂了一个下载按钮。 扩展后效果如图: (根据2022年版课程…

fastadmin 部署后前台会员中心出现404错误

访问前台会员中心出现404错误。 解决:nginx访问站点增加伪静态 location / {if (!-e $request_filename){rewrite ^(.*)$ /index.php?s$1 last; break;} }在phpstydy中增加伪静态,如图: