首页 程序笔记 c#中责任链模式详解

c#中责任链模式详解

基本介绍:

  “责任链”顾名思义,是指一个需要负责处理请求的链条

  每个链条节点都是一个单独的责任者,由责任者自己决定是否处理请求或交给下一个节点

  在设计模式中的解释则为:为请求创建了一个接收者对象的链。适用于有多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定的情况。

  俗话说起来就是一群领导组成了一个上下级链路关系,每个领导的职责各不相同,老百姓办事情的时候肯定没办法知道该找哪个领导。

  这个时候就可以把需要办的事情交给接待人员,由接待人员自行判断是不是可以处理或者交给上级处理,至于是谁给我负责,那我这个小老百姓并不关心,只要办了就可以了。

  老百姓办的事情就是请求,接待人员和领导群组成的集合就是责任链,每个领导负责自己的职责,至于最后是谁负责,那就根据具体事情一级一级的传递动态决定。

  这么做的好处也显而易见,我的请求可以是任意的,具体要不要解决由谁解决,都交给责任链自己去判断。

举例说明:

  公司的请假系统,当一个员工提交请假申请时,根据请假天数和职位的不同,需要由不同等级的领导审批。

  项目组长》部门经理》总经理》董事长》董事会就组成了一个责任链。

  普通员工和项目组长都是请假1天,但是由谁负责审批,交给责任链就可以了,由责任链自己决定由谁去审批。

  比如普通员工请假1天,只需要交给项目组长审批就可以。但如果是项目组长请假1天,需要交给部门经理审批。

  这种直接有单个责任人负责处理的称为纯的职责链模式

  一个请求必须被某一个处理者对象所接收,且一个具体处理者对某个请求的处理只能采用以下两种行为之一:自己处理或把责任提交给上级处理。

 

  如果普通员工请假1个月,项目组长一般没有直接审批的权限,需要先由项目组成初步审批,再由项目组长提交给部门经理进行审批。

  这种单个责任人负责部分责任的情况称为不纯的职责链模式

  允许出现某一个具体处理者对象在承担了请求的一部分责任后又将剩余的责任传给上级的情况,且一个请求可以最终不被任何接收端对象所接收。

 

  在一个纯的职责链模式里面,一个请求必须被某一个处理者对象所接收;

  在一个不纯的职责链模式里面,一个请求可以被多个处理者对象所处理或最终不被任何接收端对象所接收。

基本结构:

  抽象处理者角色:它定义一个处理请求的接口或抽象类,由于不同的具体处理者处理请求的方式不一样,因此在其中定义一个抽象的处理方法。同时该类需要维持一个指向上级的引用,通过该引用,处理者可以连成一条线。

  具体处理者角色:继承自抽象类,具体实现处理方法,在处理方法中进行处理或不满足职责向上级转发请求。

  客户端角色:负责链路组合顺序。

  请求者角色:构建请求对象。一般通过参数方式注入到具体处理类中。

优缺点:

  优点

  • 降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。
  • 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。
  • 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
  • 责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
  • 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

  缺点

  • 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
  • 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
  • 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。

总结:

  责任链模式属于行为型模式。它使多个对象都有机会处理请求,从而避免发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。


站心网

基本介绍:  “责任链”顾名思义,是指一个需要负责处理请求的链条。  每个链条节点都是一个单独的责任..

为您推荐

交易系统:退款单模型设计详解

大家好,我是汤师爷~和退款单作为整个交易逆向系统的核心,支撑着售后管理环节。售后域核心概念模型1、退款单退款单是记录和跟踪退款处理过程的核心业务单据,包含以下关键信息:租户ID:标识所属商户或组织退款单ID..

责任的概念与重要性解析

责任是指个人或组织在特定角色或情境下应履行的义务或承担的任务。它通常涉及对行为、决策及其后果的负责。责任可以分为多个方面:道德责任:基于社会道德规范,个人或组织应对自己的行为负责。法律责任:根据法律规..

JavaScript API 设计原则详解

前言本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块。系卤煮自己总结的一些经验和教训。本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来。很难做到详..

JavaScript 事件委托详解

基本概念事件委托,通俗地来讲,就是把一个元素响应事件(click、focus……)的函数委托到另一个元素;一般来讲,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事件的是外层元素,当事件响应..

JavaScript 中的遍历详解

编程这么多年,要是每次写遍历代码时都用 for 循环,真心感觉对不起 JavaScript 语言~对象遍历为了便于对象遍历的测试,我在下面定义了一个测试对象obj。测试对象// 为 Object 设置三个自定义属性(可枚举)Object.p..

详解:订单履约系统规划

大家好,我是汤师爷~什么是订单履约系统?订单履约是从消费者下单支付到收到商品的全流程管理过程,包括订单接收、订单派单、库存分配、仓储管理和物流配送等环节,核心目标是确保商品准时、准确地送达消费者手中。..

Redis 数据结构详解

Redis 数据类型分为:字符串类型、散列类型、列表类型、集合类型、有序集合类型。Redis 这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作。原子操作:最小的操作单位,不能继续拆分..

.NET C#中的Func、Predicate和Expression用法详解

在 .NET C# 中,Func、Predicate 和 Expression 是非常常见的委托类型和表达式树,广泛用于函数式编程、数据查询(如 LINQ)以及表达式编译等场景。以下是它们的详细用法和区别。1. FuncFunc 是一个通用委托,用于表..

ASP.NET MVC最常用的设计模式代码示例

ASP.NET MVC 是一个基于分层架构的框架,其核心架构本身已经实现了 MVC 模式(Model-View-Controller)。除了 MVC 模式,开发者在使用 ASP.NET MVC 开发应用时,通常会结合其他设计模式以提高代码的可维护性、可扩展..

.Net Core中Dapper的使用详解

1.安装Dapper这里直接使用Nuget安装。安装版本是1.50.5安装完成之后,发现Nuget下已经有了Dapper。2.创建DapperHelper接下来创建一个DapperHelper帮助类,来进行读取数据库连接字符串,打开数据库等操作。public cla..

设计模式之高质量代码

0,什么是高质量代码我觉得回答这个问题,应该从两个方面考虑。从业务角度考虑。首先,在公司开发一款软件,应该是业务在驱动。所以,从这个角度来说,代码第一个应该满足的是业务需求,如果连最基本的业务需求都满..

Blazor的N种渲染模式原理和常见问题说明

我们从下面这幅图开始,下图显示了三种渲染模式,分别称之为静态SSR、交互式SSR(即之前的BlazorServer)、交互式CSR(即之前的BlazorWasm)。还有一种渲染模式BlazorHybrid,稍后说。一、先浅层理解一个图例静态SSR:经..

前端CSS常见的三种设计模式

CSS设计模式主要包括OOCSS、SMACSS和BEMCSS等。以下是对这些模式的具体介绍:OOCSS:面向对象的CSS,旨在编写高可复用、低耦合和高扩展的CSS代码。它将抽象(结构)和实现(样式)分离,抽离公共代码,以提高代码的..

解释一下MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)模式,并比较它们之间的区别。

MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)是两种常见的软件架构模式,用于组织和分离应用程序中的不同部分。它们有一些相似之处,但也有一些明显的区别。MVC模式Model(模型):负责处理应用程序..

.NET常见设计模式面试题

.NET 设计模式是软件工程中的一个重要概念。设计模式可以帮助我们设计和构建更加可靠、可扩展和可维护的软件系统。以下是一些常见的 .NET 设计模式面试题:什么是设计模式?.NET 有哪些常见的设计模式?设计模式有什..

DevEco Studio鸿蒙OS系统开发环境搭建详解

DevEco Studio 是华为推出的一款面向华为终端全场景多设备的集成开发环境(IDE),为开发者提供工程模板创建、开发、编译、调试、发布等E2E的HarmonyOS应用开发服务。DevEco Studio官网:https://developer.harmonyo..

JavaScript设计模式学习网站Patterns

今天分享一个Javascript学习网站patterns。patterns官网:https://www.patterns.dev/patterns学习书籍下载地址:https://www.patterns.dev/book改进构建 Web 应用程序的方式Patterns.dev 是一本关于设计模式和组件模..

ASP.NET Core微服务架构中使用RabbitMQ实现CQRS模式

微服务架构代表了软件设计的范式转变,将大型单体应用程序分解为更小的、可管理的服务,这些服务独立运行并通过定义良好的 API 进行通信。微服务架构概述在 C# 中,微服务可以是更大系统的一部分:using System;usin..

定时调度框架系列之Quartz.Net详解

一. 背景我们在日常开发中,可能你会遇到这样的需求:"每个月的3号给用户发信息,提醒用户XXX "、"每天的0点需要统计前一天的考勤记录"、"每个月的1号计算上个月的库存情况"、"定时初始化数据供其它业务使用"、"每隔..

Nginx配置文件(nginx.conf)配置参数详解

Nginx的配置文件nginx.conf配置参数非常多,做网站配置或维护难免需要修改nginx的配置文件,以下针对配置文件中的各种配置参数做出详细的解释,供参考。user nginx nginx ; #Nginx用户及组:用户 组。window下不指定..

发表回复

返回顶部