C#设计模式之责任链模式

C#设计模式教程(14):责任链模式 责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象处理一个请求,或者将这些对象连成一条链。在这条链上的每个对象会决定它能处理这个请求还是将其传递给链上的下一个对象。在C#中实现责任链模式,通常会有一个抽象处理者(Handler)角色,定义了一个处理请求的接口,以及一个或多个具体处理者(ConcreteHandler)角色,它们处理请求或将请求传递给链上的下一个处理者。 阅读详情

责任链模式


本篇博客将介绍责任链模式,责任链模式是行为型设计模式,行为型模式关注对象之间的交互,研究系统在运行时对象之间的相互通讯和协作,进一步明确对象的职责。当我们的系统中存在多个对象可以处理同一个请求的时候,我们就可以通过责任链模式将这些处理请求的对象连成一条链,让请求可以沿着这个链传播。如果链上的对象可以处理该请求就处理,否则就转发给下家。

模式分类

行为型设计模式。

模式产生的原因

在很多情况下,可以处理对象请求的对象不止一个,例如大学里的奖学金审批,学生再向辅导员提交申请表后,首先是辅导员签字审批,然后交给系主任签字审批,接着是院长,最后是校长。在这个过程中,学生的申请表可以看作是一个请求对象,而辅导员,系主任,院长,校长就是一个一个的责任链对象,除了辅导员外学生不需要与其他的审批者一一交互。

实际上责任链可以是一条直线,一个环或者一个树形结构。最常见的责任链就是直线型,也就是沿着一条单向的链来传递请求。链上的每一个对象都是请求的处理者,职责链模式可以将对象处理者连成一条线,并让请求沿着链传播,客户端只需要将请求放在链上即可,将请求的发送者和处理者解耦,这就是责任链模式的动机。

模式类图

在这里插入图片描述

由图可知,责任链模式由2个对象构成:

Handler():

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

ConcreteHandler():

他是抽象处理者的子类,负责实现抽象处理者中的抽象处理方法,在处理方法中具体处理者应该书写处理请求的方法和如果不满足特定条件就发往下家。

代码实现

例子:某企业而得SCM系统中包含一个采购审批子系统。该企业的采购审批时分批进行的,即根据采购金额的不同由不同层级的主管人员来审批,主任可以审批5万元以下的采购单,董事长可以审批5万元到10万元的采购单,100万元以上需要开会决定,请使用责任链模式模拟该系统。

Approver审批人基类:

namespace ChainOfResponsibility.ChainOfResponsibility.Example
{
    public abstract class Approver
    {
        protected Approver NextApprover;
        protected string Name;

        public Approver(string name)
        {
            Name = name;
        }
        public void SetApprover(Approver nextApprover)
        {
            NextApprover = nextApprover;
        }

        public abstract void Operation(PurchaseArgs args);
    }
}

PurchaseArgs采购信息类:

namespace ChainOfResponsibility.ChainOfResponsibility.Example
{
    public class PurchaseArgs
    {
        public float TotalMoney;
        public string ObjectName;
    }
}

Director采购员类:

namespace ChainOfResponsibility.ChainOfResponsibility.Example
{
    public class Director : Approver
    {
        
        public override void Operation(PurchaseArgs args)
        {
            NextApprover.Operation(args);
        }

        public Director(string name) : base(name)
        {
        }
    }
}

VicePresident主任类:

using System;
using System.Diagnostics;

namespace ChainOfResponsibility.ChainOfResponsibility.Example
{
    public class VicePresident : Approver
    {
        
        public override void Operation(PurchaseArgs args)
        {
            if (args.TotalMoney < 50000f)
            {
                Console.WriteLine($"{Name}处理了该条订单{args.ObjectName},金额为{args.TotalMoney}");
            }
            else
            {
                NextApprover.Operation(args);
            }
        }

        public VicePresident(string name) : base(name)
        {
        }
    }
}

President董事长类:

using System;

namespace ChainOfResponsibility.ChainOfResponsibility.Example
{
    public class President : Approver
    {
        

        public override void Operation(PurchaseArgs args)
        {
            if (args.TotalMoney < 100000f)
            {
                Console.WriteLine($"{Name}处理了该条订单{args.ObjectName},金额为{args.TotalMoney}");
            }
            else
            {
                NextApprover.Operation(args);
            }
        }

        public President(string name) : base(name)
        {
        }
    }
}

Congress开会决议类:

using System;

namespace ChainOfResponsibility.ChainOfResponsibility.Example
{
    public class Congress : Approver
    {

        public override void Operation(PurchaseArgs args)
        {
            if (args.TotalMoney < 1000000f)
            {
                Console.WriteLine($"{Name}处理了该条订单{args.ObjectName},金额为{args.TotalMoney}");
            }
            else
            {
                Console.WriteLine($"订单废弃");
            }
        }

        public Congress(string name) : base(name)
        {
        }
    }
}

Program类:

using ChainOfResponsibility.ChainOfResponsibility.Example;
using ChainOfResponsibility.ChainOfResponsibility.Question4;
using Director = ChainOfResponsibility.ChainOfResponsibility.Question4.Director;

namespace ChainOfResponsibility
{
    internal class Program
    {
        public static void Main(string[] args)
        {
           Director director = new Director("director");
            VicePresident vicePresident = new VicePresident("vicePresident");
            President president = new President("president");
            Congress congress = new Congress("congress");
            director.SetApprover(vicePresident);
            vicePresident.SetApprover(president);
            president.SetApprover(congress);
            director.Operation(new PurchaseArgs()
            {
                ObjectName = "玩具",
                TotalMoney = 1000,
            });
            director.Operation(new PurchaseArgs()
            {
                ObjectName = "桌子",
                TotalMoney = 20000,
            });
            director.Operation(new PurchaseArgs()
            {
                ObjectName = "电视",
                TotalMoney = 500000,
            });
            director.Operation(new PurchaseArgs()
            {
                ObjectName = "工厂",
                TotalMoney = 9000000,
            });
        }
    }
}

责任链模式总结

责任链模式的优点:

  1. 责任链模式使得一个对象无需知道是其他那一个对象处理其请求,仅需知道该请求会被处理即可。请求者和接收者之间解耦。更形象一点,责任链模式是一种情况下对于ifelse这种条件分支的解耦。,
  2. 再给对象分配职责时,责任链模式可以带来更多的灵活性,可以在运行时对该链进行动态的增加和修改。符合开闭原则。

责任链模式的缺点:

  1. 由于一个请求并没有直接指定的处理者,所以存在请求最终不能被处理的风险。
  2. 对于较长的责任链,系统性能会受到影响。
  3. 如果键链不当可能会导致循环调用。
设计模式(C#)——12责任链模式 推荐阅读: &amp;nbsp;我的优快云 &amp;nbsp;我的博客园 &amp;nbsp;QQ群:704621321 前言 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在开发游戏过程中,当玩家合成一种道具的时候,对于不痛的道具,需要的碎片个数,类型是不同的。用传统的写发,就是使用if…else…语句来判断。如果后面,策划修改了道具合成机制, 阅读详情

相关推荐

西门子smart能搜到cpu但连接当前IP地址失败

将ip地址改到同一网段 本机为192.168.1.119就是192.168.1.1网段,但plc在192.168.0.1网段,所以显示ip连接失败,改为同一网段192.168.1.xxx即可(为避免ip冲突尽量改到200往后最大255)如果显示这一步,那么你的物理连接是没有问题的,应当是plc和电脑并不在同一网段导致的问题。输入ipconfig 查看本机网段与plc是否为同一网段。此电脑就不在同一网段所有造成通讯失败,接下来解决这个问题。win+r打开运行,打开cmd。再次尝试,如果还是报错,那么。

weixin_62678581的博客 9864

【设计模式】职责链模式(C#)

C#实现职责链模式,从POP到OOP,抽象类,最后到责任链模式+建造者模式,一步一步分析各个过程的优缺点,不断优化代码。

baidu_33146219的博客 2万+

STM32F407硬件IIC驱动OLED避坑实录:从‘不显示’到‘稳定刷屏’的完整调试过程

本文详细记录了使用STM32F407硬件IIC驱动OLED屏幕的完整调试过程,从初始的‘不显示’问题到最终实现‘稳定刷屏’。文章涵盖了硬件接线、I2C外设配置、常见问题排查及性能优化技巧,特别针对STM32标准库开发中的难点提供了实用解决方案,是嵌入式开发者驱动OLED屏幕的实用指南。

weixin_30315723的博客 303

C# 设计模式(行为型模式):责任链模式

责任链模式是一种优雅的设计模式,适用于需要动态分配职责的场景。通过它,可以实现请求发送者与处理者的解耦,使系统具有更好的扩展性和灵活性。如果你正在设计一个多级处理的系统,不妨试试责任链模式!希望这篇文章能帮助你更好地理解责任链模式!如果有疑问或建议,欢迎在评论区留言 😊。

玉面小浪君的博客 941

Rancher操作手册(v2.7.5-rc1)

选择需要创建ingress的命名空间 ==》填写ingress名称 ==》在“规则”一栏,选择“Prefix” ==》输入访问路径 ==》选择访问路径对应的service ==》如果需要继续添加访问路径,点击“添加路径”,重复前面的步骤即可。选择需要创建Deployment的命名空间 ==》填写Deployment名称 ==》选择通用 ==》填写容器名称 ==》填写镜像 ==》选择镜像的拉取密文 ==》点击添加端口或Service。点击左侧菜单栏的集群里的“项目/命名空间”,点击右下角的“创建命名空间”。

weixin_60197334的博客 5570

PX4飞控与MAVROS实战:从零搭建无人机ROS通信环境(附常见报错解决)

本文详细介绍了如何从零搭建PX4飞控与ROS的通信环境,重点解析了MAVROS的安装、硬件连接、串口权限配置以及坐标系转换等核心步骤。针对GeographicLib数据下载失败、串口权限不足等常见报错提供了实用解决方案,并附有Offboard模式控制的代码示例,帮助开发者快速建立稳定的无人机ROS开发环境。

dapp9builder的博客 335

C# 设计模式之职责链模式

C# 设计模式之职责链模式

鲤籽鲲的博客 1681

从入门到实战:rkhunter(Rootkit猎手)在Linux服务器安全运维中的部署与自动化监控

本文详细介绍了rkhunter(Rootkit猎手)在Linux服务器安全运维中的部署与自动化监控方法。从Rootkit的危害性入手,讲解了rkhunter的安装、配置及实战应用,包括如何建立基准、优化定时任务方案以及智能告警处理。通过多级过滤脚本和系统级联动,帮助运维人员高效识别和应对Rootkit威胁,提升服务器安全性。

weixin_28715953的博客 240

c#设计模式-行为型模式 之 责任链模式

又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对 象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

二十多岁的你迷茫又着急,想要车子,想要房子,想要享受旅行,你那么浮躁,拿什么看透人生! 811

2025海外代理IP深度横评:Bright Data、IPFoxy、SmartProxy等六大服务商实战对比

本文深度横评2025年六大海外代理IP服务商(Bright Data、IPFoxy、SmartProxy、IPIPGO、Kookeey及青果网络),基于实战测试数据,从IP池质量、速度稳定性、性价比等维度进行对比。针对跨境电商、数据爬虫、社交媒体管理等不同业务场景,提供精准的选购指南与避坑建议,帮助企业用户根据自身需求选择最合适的代理IP解决方案。

weixin_29196891的博客 434

15、基于最优传输的协作多视图聚类框架

本文提出了一种基于最优传输理论的协作多视图聚类框架,通过引入协作学习机制在不同视图间建立先验交互,以提升共识聚类的质量。框架包含两种新方法:协作共识投影方法(CoCP)和基于新表示的协作共识方法(CoCNR)。CoCP在全局空间中整合多视图信息并进行共识投影,而CoCNR则通过协作编码生成新的数据表示以实现更优聚类。方法利用熵正则化的Wasserstein距离与Wasserstein重心,有效捕捉数据分布间的几何结构,并通过聚合步骤获得统一模型。实验结果表明,所提方法在多个数据集上均优于现有方法,具有良好的

gpt4scribbler的博客 85

C# 设计模式:第十三章 - 行为型模式 之 责任链模式(Chain of Responsibility Pattern)

这种模式通过创建一个处理者链来处理请求。每个处理者都可以处理请求,或者将请求传递给链上的下一个处理者。这种模式降低了请求发送者和接收者之间的耦合度,使得系统更加灵活和可扩展。

caifox的博客 1290

超详细的Burp Suite安装使用

‌Burp Suite是一个强大的Web应用安全测试工具,适用于网络安全专业人士进行自动化网络应用程序的安全测试。‌ 它提供了在Windows和Kali Linux上安装和激活Burp Suite Professional的简便步骤,帮助用户快速集成并启用强大的网络扫描和渗透测试功能。Burp Suite的特点包括易于安装、良好的兼容性、内置的自动化工具、优秀的用户体验以及详细的教程,使得无论是安全领域的新手还是经验丰富的专家,都能轻松上手并高效地进行安全测试。此外,Burp Suite还支持扩展功能的使用

Dreams°的博客 2641

【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】

责任链模式通过将请求和处理者解耦,关联多个处理者形成一个链条,使每个处理者都有机会处理请求,避免了将所有处理逻辑集中在一个对象中的复杂性。

weixin_43626218的博客 742

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

[索引页][源码下载]乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)作者:webabcd介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。示例有一个Message实体类,某个类对它的操作有

webabcd的专栏 486

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C# 设计模式——责任链模式

设计模式中责任链模式的Csharp示例

D_lxl的博客 467

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C#-设计模式-责任链模式

从生活中的例子可以发现,某个请求可能需要几个人的审批,即使技术经理审批完了,还需要上一级的审批。这样的例子,还有公司中的请假,少于3天的,直属Leader就可以批准,3天到7天之内就需要项目经理批准,多余7天的就需要技术总监的批准了。介绍了这么多生活中责任链模式的例子的,下面具体给出面向对象中责任链模式的定义。责任链模式指的是——某个请求需要多个对象进行处理,从而避免请求的发送者和接收之间的耦合关系。将这些对象连成一条链子,并沿着这条链子传递该请求,直到有对象处理它为止。

Asincereman的专栏 433

201802191355->深入浅出设计模式:c#责任链模式

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _012责任链模式 {     public class Product     {         public int

qq_28902031的博客 153

C# 设计模式———责任链模式

责任链模式简介 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求直到有对象处理完为止。 在处理消息的时候以过滤很多道; 行为的请求和行为的处理进行了解耦。然后请求可以从这个链表进行流转,这个行为会让链表中各个节点都可能处理到当前的请求。 C# 责任链模式Demo Task: 请假 请假3天及以内 --> 开发经理 请假...

chasinghope的博客 593

Design Pattern - Chain of Responsibility(C#)

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DefinitionA

yffhhffv的博客 155

23种设计模式之《责任链模式(Chain of Responsibility)》在c#中的应用及理解

通过责任链模式,我们可以将请求的处理逻辑分散到多个对象中,从而实现解耦和灵活性。在实际开发中,责任链模式常用于审批流程、日志处理、异常处理等场景。

yuanpan的专栏 1042
上一篇: C#设计模式之代理模式
下一篇: C#设计模式之命令模式
BraveRunTo
博客等级 码龄7年 91粉丝 75原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值