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

🚀简介

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

  1. 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  2. 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  3. 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

🚀案例

🐤抽象处理者

Handler类是所有具体处理者的基类,它定义了一个Handler类型的字段successor,这个字段指向链中的下一个处理者。SetSuccessor方法用于设置这个字段的值。

当一个请求到来时,如果当前处理者无法处理,它会将请求传递给链中的下一个处理者(即successor)。这就是责任链模式的基本工作原理。

cs 复制代码
public abstract class Handler
{
    protected Handler successor;

    public void SetSuccessor(Handler successor)
    {
        this.successor = successor;
    }

    public abstract void HandleRequest(int request);
}

🐤具体处理者

三个处理者类:ConcreteHandler1,ConcreteHandler2和ConcreteHandler3,它们都继承自抽象处理者类Handler。

每个具体处理者类都有一个HandleRequest方法,这个方法用于处理请求。如果当前处理者无法处理请求,那么它会将请求传递给下一个处理者。

例如,ConcreteHandler1只能处理0到10之间的请求,如果请求的值大于10,那么它就会将请求传递给下一个处理者。同样,ConcreteHandler2只能处理10到20之间的请求,如果请求的值大于20,那么它就会将请求传递给下一个处理者。ConcreteHandler3只能处理20到30之间的请求,如果请求的值大于30,那么它就会将请求传递给下一个处理者。

cs 复制代码
public class ConcreteHandler1 : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 0 && request < 10)
        {
            Console.WriteLine($"{this.GetType().Name} handled request {request}");
        }
        else if (successor != null)
        {
            successor.HandleRequest(request);
        }
    }
}

public class ConcreteHandler2 : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 10 && request < 20)
        {
            Console.WriteLine($"{this.GetType().Name} handled request {request}");
        }
        else if (successor != null)
        {
            successor.HandleRequest(request);
        }
    }
}

public class ConcreteHandler3 : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 20 && request < 30)
        {
            Console.WriteLine($"{this.GetType().Name} handled request {request}");
        }
        else if (successor != null)
        {
            successor.HandleRequest(request);
        }
    }
}

🐤测试

cs 复制代码
class MyClass
{
    public static void Main(string[] args)
    {
        Handler h1 = new ConcreteHandler1();
        Handler h2 = new ConcreteHandler2();
        Handler h3 = new ConcreteHandler3();
        h1.SetSuccessor(h2);
        h2.SetSuccessor(h3);

        int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };

        foreach (int request in requests)
        {
            h1.HandleRequest(request);
        }
    }
}

运行结果

🚀优缺点

优点:

  1. 降低了请求发送者和接收者的耦合度。
  2. 可以根据需要增加新的请求处理类,满足开闭原则。
  3. 当工作流程发生变化,可以动态地改变链内的成员或者修改它们的次序,也可动态地新增或者删除责任。
  4. 一个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
  5. 每个类只需要处理自己该处理的工作,不能处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

缺点:

  1. 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
  2. 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
  3. 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。
相关推荐
椒颜皮皮虾྅10 小时前
OpenVINO C# API 3.3.1:支持OpenVINO 2026.3及GenAI增强
人工智能·c#·openvino
半亩码田12 小时前
C#转Python第3.1篇:Python 的 class 没有访问修饰符?面向对象的另一条路
开发语言·python·c#
AI人工智能+电脑小能手16 小时前
大白话说Java设计模式-08-建造者模式(业务实战篇)
java·设计模式·建造者模式·架构设计·对象构建
唐青枫19 小时前
别再手写 args[0]:C#.NET CommandLineParser 命令行工具实战详解
c#·.net
AustinXu19 小时前
从 Claude Code 到 Claude Tag,Harness Engineering 走到了组织这一层
设计模式·团队管理
剧中有戏19 小时前
单例模式从入门到精通:一个数据库连接池的完整剖析
设计模式
胡萝卜术20 小时前
编译期与运行期的双重防线:从 TypeScript 类型之争到 LLM 输出的自动化择优
前端·设计模式·面试
货拉拉技术20 小时前
重塑 Agent 度量衡:基于 LLM-as-a-Judge 的离线评估体系与实践
算法·设计模式
LccKyI20 小时前
C#学习day06(方法/函数及其关键字,附思维导图)
经验分享·学习·c#
KhalilRuan20 小时前
设计模式小记
设计模式