设计模式-责任链模式(Chain of Responsibility Pattern)结构|原理|优缺点|场景|示例

本文主要是介绍设计模式-责任链模式(Chain of Responsibility Pattern)结构|原理|优缺点|场景|示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                                    设计模式(分类)        设计模式(六大原则)   

    创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

    结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

    行为型(11种)      策略模式        模板方法模式        观察者模式        迭代器模式     责任链模式     命令模式    备忘录模式          状态模式         访问者模式        中介者模式 


责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它将请求的发送者与接收者解耦,让多个接收者对象形成一条链,并沿着这条链传递请求,直到有一个接收者处理它为止。每个接收者都有权决定是否处理请求,或者将请求转发给链上的下一个接收者。

结构:

  • Handler(处理者)接口/抽象类: 定义处理请求的接口,通常包含一个处理请求的方法(如 handleRequest()),以及一个设置或获取下一个处理者的方法(如 setNext() 和 getNext())。
  • ConcreteHandler(具体处理者): 实现处理者接口,负责处理特定类型的请求。每个具体处理者在处理请求时,可以选择处理请求、拒绝处理(通常通过返回特定值或抛出异常表示)或将其转发给下一个处理者。

原理: 

        请求发起者只需将请求发送给链上的第一个处理者,后续的传递过程完全由链上的处理者自行决定。每个处理者检查请求是否符合其处理条件,若符合则处理并终止传递,否则将请求转发给下一个处理者。这样,请求的发送者无需关心请求如何被处理,处理的责任分散在链上的各个处理者中。

优缺点:

  • 优点

    • 发送者与接收者解耦,增加系统的灵活性,易于扩展新的处理者或调整处理顺序。
    • 便于实现请求的分发、过滤、路由等功能。
    • 通过在链上动态地添加或删除处理者,可以改变系统的处理行为。
  • 缺点

    • 链条过长可能导致请求处理的效率下降。
    • 如果处理链的构造不合理,可能会导致请求得不到处理(例如,链中没有能够处理该请求的处理者)。
    • 调试较为困难,因为请求的处理过程可能涉及多个处理者。

场景:

  • 处理请求可能有多种方式或多种条件,需要在运行时动态确定。
  • 不希望请求发送者与接收者之间存在紧密耦合。
  • 需要对请求进行过滤、分发、路由等操作。

 代码示例(以Java为例)

在责任链模式中,决定下一个处理者的责任通常由处理者自身承担。具体而言,每个处理者在处理请求时,可以根据请求的内容、自身的处理能力等因素,判断是否需要将请求传递给链上的下一个处理者。下面是一个Java实现的例子,展示了处理者如何决定下一个处理者:

// 处理者接口
public abstract class Handler {protected Handler nextHandler;public void setNext(Handler handler) {this.nextHandler = handler;}public abstract void handleRequest(Request request);
}// 具体处理者A
public class ConcreteHandlerA extends Handler {@Overridepublic void handleRequest(Request request) {if (canHandle(request)) {// 处理请求...System.out.println("ConcreteHandlerA handled the request.");} else if (nextHandler != null) {nextHandler.handleRequest(request);} else {System.out.println("No suitable handler found for the request.");}}private boolean canHandle(Request request) {// 根据请求内容判断处理者A是否能处理该请求// 这里仅作为示例,实际逻辑应根据业务需求实现return request.getType().equals("TypeA") && request.getPriority() >= 5;}
}// 具体处理者B
public class ConcreteHandlerB extends Handler {@Overridepublic void handleRequest(Request request) {if (canHandle(request)) {// 处理请求...System.out.println("ConcreteHandlerB handled the request.");} else if (nextHandler != null) {nextHandler.handleRequest(request);} else {System.out.println("No suitable handler found for the request.");}}private boolean canHandle(Request request) {// 根据请求内容判断处理者B是否能处理该请求// 这里仅作为示例,实际逻辑应根据业务需求实现return request.getType().equals("TypeB") && request.getPriority() <= 8;}
}// 请求类
public class Request {private String type;private int priority;// ... 构造函数、getters、setters ...
}// 使用示例
public class Client {public static void main(String[] args) {Handler handlerA = new ConcreteHandlerA();Handler handlerB = new ConcreteHandlerB();handlerA.setNext(handlerB);  // 构建责任链Request requestA = new Request("TypeA", 7);  // 创建请求对象ARequest requestB = new Request("TypeB", 6);  // 创建请求对象BhandlerA.handleRequest(requestA);  // 发起请求AhandlerA.handleRequest(requestB);  // 发起请求B}
}

        在这个例子中,ConcreteHandlerA 和 ConcreteHandlerB 分别实现了 canHandle() 方法,用于判断是否能处理给定的请求。在 handleRequest() 方法中,每个处理者首先检查自己是否能处理请求,如果可以,则处理请求并终止传递;否则,将请求传递给下一个处理者。这种设计使得每个处理者都能根据请求内容自主决定是否处理或传递请求,从而实现了责任链模式的核心思想。

这篇关于设计模式-责任链模式(Chain of Responsibility Pattern)结构|原理|优缺点|场景|示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/949849

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可