设计模式之 责任链模式

news/2024/11/23 21:38:20/

责任链模式(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.ppmy.cn/news/1549371.html

相关文章

蓝桥杯某C语言算法题解决方案(质因数分解)

蓝桥杯原题&#xff1a;将一个正整数分解质因数例如&#xff1a;输入90&#xff0c;打印出90 2 * 3 * 3 * 5。 声明&#xff1a;该题目是否为蓝桥杯原题未知&#xff0c;我是从CSDN上面查到的&#xff0c;仅对该题目进行解决。 这个题与我之前发表过的一些关于检验一个数字是…

iOS无人直播虚拟视频实用版

iOS无人直播虚拟视频实用版 资源描述 本资源提供了一个名为“iOS无人直播虚拟视频实用版”的资源文件&#xff0c;该文件允许用户在iOS设备上实现无人直播功能&#xff0c;通过虚拟视频技术播放指定的视频内容。该资源文件特别适用于需要进行刷脸验证的场景&#xff0c;用户可…

windows已建立威胁IP排查

在应急响应的时候&#xff0c;需要筛选出服务器建立连接的进程、PID&#xff0c;此代码可满足该需求实现共计2步 首先windos netstat-ano > all.txt&#xff0c; 上传至pycharm路径 第一步获取服务器建立连接的ip import re# 从文件读取 netstat 输出 def read_netstat_f…

【Flask+Gunicorn+Nginx】部署目标检测模型API完整解决方案

【Ubuntu 22.04FlaskGunicornNginx】部署目标检测模型API完整解决方案 文章目录 1. 搭建深度学习环境1.1 下载Anaconda1.2 打包环境1.3 创建虚拟环境1.4 报错 2. 安装flask3. 安装gunicorn4. 安装Nginx4.1 安装前置依赖4.2 安装nginx4.3 常用命令 5. NginxGunicornFlask5.1 ng…

干货分享|分布式数据科学工具 Xorbits 的使用

本章介绍分布式数据科学工具 Xorbits 。 1 Xorbits Data Xorbits Data 是一个面向数据科学的分布式计算框架&#xff0c;功能类似于 Dask 和 Modin&#xff0c;用于加速 Pandas DataFrame 和 NumPy。Xorbits Data 通过切分大数据集并利用 Pandas 或 NumPy 执行操作。其底层采…

java Queue 详解

Java Queue 详解 Queue 是 Java 集合框架中用于实现 队列 数据结构的接口&#xff0c;位于 java.util 包中。队列是一种 先进先出&#xff08;FIFO&#xff09; 的数据结构&#xff0c;元素按照插入的顺序依次出队。 1. Queue 的基本特性 FIFO&#xff08;First-In-First-Out&…

鸿蒙学习高效开发与测试-应用程序框架和HarmonyOS SDK(3)

文章目录 1、应用程序框架1、规范化后台进程管理2、原生支持分布式3、支持多设备的统一窗口管理4、 组件共享及面向对象5、逻辑与界面解耦6、灵活扩展机制2、HarmonyOS SDK1、 开放能力 Kit2、开放能力的检索和使用3、 方舟工具链4、前端编译器架构1、应用程序框架 应 用 程 序…

基于 RBF 神经网络辨识的单神经元 PID 模型参考自适应控制

这是一个基于 RBF 神经网络辨识 和 单神经元 PID 模型参考自适应控制 的系统框图&#xff0c;包含以下主要部分&#xff1a; RBF 神经网络模块&#xff1a;用于对系统进行辨识&#xff0c;输入误差 e(t)e(t)e(t) 和误差变化量 Δe(t)\Delta e(t)Δe(t)&#xff0c;输出与系统特…