设计模式--责任链模式

ops/2024/9/23 23:24:16/

责任链模式(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 {@Overridepublic 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 {@Overridepublic 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.ppmy.cn/ops/115010.html

相关文章

【Linux】Docker:离线主机部署

在网络环境下准备 Docker 下载 Docker 安装包&#xff1a; 在另一台有网络连接的计算机上&#xff0c;访问 Docker 官方下载页面。选择并下载适合您系统的 Docker 版本&#xff0c;通常是最新的稳定版本&#xff0c;例如 docker-<version>.tgz。 传输文件&#xff1a;…

【设计模式-享元】

Flyweight Pattern&#xff08;享元模式&#xff09; 是一种结构型设计模式&#xff0c;旨在通过共享对象来减少内存使用和提高性能。享元模式特别适用于需要大量相似对象的场景&#xff0c;可以有效地减少内存开销。 核心思想 享元模式通过将对象的共享部分&#xff08;共享…

6、论文阅读:水下图像增强基准数据集及其他数据集

水下图像增强基准数据集及其他数据集 前言引言贡献现有方法、评估指标和数据集:概述水下增强方法基于补充信息的方法基于非物理模型的方法基于物理模型的方法数据驱动的方法水下图像质量评估完整参考指标没有参考指标水下图像数据集提出基准数据集数据收集参考图像的生成评估与…

尚品汇-Jenkins部署构建服务模块、Linux快照备份(五十七)

目录&#xff1a; &#xff08;1&#xff09;构建作业&#xff08;server-gateway&#xff09; &#xff08;2&#xff09;构建service_product模块 &#xff08;3&#xff09;演示添加新代码 &#xff08;4&#xff09;学会使用linux快照 &#xff08;1&#xff09;构建作…

Android 后台服务之Persistent 属性

在 Android 开发中,有时我们需要后台服务持续运行,以保持应用的某些功能。例如,音乐播放器需要在后台播放音乐,或者健康应用需要持续跟踪用户的运动数据。后台服务是 Android 中的一种组件,它不与用户界面交互,能够在后台执行长时间运行的任务。由于 Android 系统的资源管…

微信抢红包设计

包几个红包&#xff0c;发红包的总金额塞钱进红包&#xff0c;弹出支付的界面&#xff0c;支付完之后就会被发到 群里抢拆红包&#xff0c;才是真正的抢红包 红包金额怎么分配 每个人至少抢到1分钱人数抢到的金额之和就应该是红包的总金额一个人抢的红包不应该极度的大&#…

【Python报错已解决】AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

快来看看!如何利用工具轻松实现自动加好友

大家都知道&#xff0c;手动添加大量好友不仅耗时&#xff0c;还很容易出错。这时候&#xff0c;借助一些工具就显得尤为重要&#xff01; 今天&#xff0c;就给大家分享一个多微管理工具&#xff0c;让你实现自动加好友。 首先&#xff0c;在多微管理工具上登录你的微信账号…