设计模式-责任链模式(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

相关文章

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化