c# 责任链模式

news/2024/5/19 16:03:20 标签: c#, 责任链模式, 开发语言

责任链模式是一种行为型设计模式,它允许多个对象按照链式结构处理请求,直到有对象能够处理请求为止。在 C# 中,责任链模式通常通过构建一个处理请求的链来实现。

下面是一个简单的示例:

首先,定义一个处理请求的抽象基类 Handler,该类包含一个指向下一个处理者的引用:

public abstract class Handler
{
    protected Handler successor;

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

    public abstract void HandleRequest(string request);
}

然后,定义具体的处理者类,继承自 Handler:


public class ConcreteHandlerA : Handler
{
    public override void HandleRequest(string request)
    {
        if (request == "A")
        {
            Console.WriteLine("ConcreteHandlerA handles the request");
        }
        else if (successor != null)
        {
            successor.HandleRequest(request);
        }
    }
}

public class ConcreteHandlerB : Handler
{
    public override void HandleRequest(string request)
    {
        if (request == "B")
        {
            Console.WriteLine("ConcreteHandlerB handles the request");
        }
        else if (successor != null)
        {
            successor.HandleRequest(request);
        }
    }
}

public class ConcreteHandlerC : Handler
{
    public override void HandleRequest(string request)
    {
        if (request == "C")
        {
            Console.WriteLine("ConcreteHandlerC handles the request");
        }
        else
        {
            Console.WriteLine("No handler can handle the request");
        }
    }
}

最后,在客户端中构建处理者链,然后开始处理请求:

public class Program
{
    public static void Main(string[] args)
    {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();

        handlerA.SetSuccessor(handlerB);
        handlerB.SetSuccessor(handlerC);

        handlerA.HandleRequest("A");
        handlerA.HandleRequest("B");
        handlerA.HandleRequest("C");
        handlerA.HandleRequest("D");
    }
}

在这个示例中,请求从 handlerA 开始,如果 handlerA 能够处理请求,则处理请求并结束。否则,请求会传递给下一个处理者 handlerB,如果 handlerB 能够处理请求,则继续处理请求并结束。如果请求一直传递到最后一个处理者 handlerC 仍然没有能够处理请求的能力,则结束处理并输出提示信息。

通过责任链模式,可以动态地构建处理请求的链,使得请求的发送者和接收者之间解耦,提高代码的灵活性和可维护性。请注意,在实际应用中,需要根据具体情况设计和组织责任链,确保每个处理者尽量只处理自己负责的请求。


http://www.niftyadmin.cn/n/5231952.html

相关文章

day3 移出链表中值为x的节点

ListNode* removeElements(ListNode* head, int val) { ListNode* dummyHead new ListNode(0); // 设置一个虚拟头结点 dummyHead->next head; // 将虚拟头结点指向head,这样方便后面做删除操作 ListNode* cur dummyHead; while (cur->next ! NULL…

数据记录的方法(轻量级)

一.文件操作 1.打开文件 fpopen(name[,mode[,buffereing]) 需要定义一个变量,再选择文件的打开参数。需要注意的是,如果参数选择不为w,w,a或a那么文件必须一开始就存在,否则会出现FileNotFoundError类型报错。此外为避免出现报错&#xff…

非标设计之螺纹选型

目录 一、螺纹种类二、 螺纹加工:第一大类:螺纹切削第二大类:螺纹滚压三、螺丝钻孔和选型: 一、螺纹种类 一、螺纹种类 按牙型可分为三角形、梯形、矩形、锯齿形和圆弧螺纹; 按螺纹旋向可分为左旋和右旋;…

react实现加载动画

1.Spinning.tsx import "./Spinning.scss";interface Props {isLoading: boolean;children?: React.ReactNode; }const Spinning: React.FC<Props> ({isLoading true,children }) > {return <div className{spinning-wrapper${isLoading ? " l…

前端大文件上传webuploader(react + umi)

使用WebUploader还可以批量上传文件、支持缩略图等等众多参数选项可设置&#xff0c;以及多个事件方法可调用&#xff0c;你可以随心所欲的定制你要的上传组件。 分片上传 1.什么是分片上传 分片上传&#xff0c;就是将所要上传的文件&#xff0c;按照一定的大小&#xff0c;将…

力扣15题 三数之和 双指针算法

15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三…

对小程序的初了解

WXML和HTML的区别 标签名称不同 HTML&#xff1a;div、a、span、img WXML&#xff1a;view、text、image、navigator 属性节点不同 <a href"#">超链接</a> <navigator url"/pages/home/home"></navigator> 提供了类似vue的…

【图论】重庆大学图论与应用课程期末复习资料2-各章考点(填空证明部分)(私人复习资料)

图论各章考点 一、图与网络的基本概念二、树三、连通性四、路径算法五、匹配六、行遍性问题七、平面图 一、图与网络的基本概念 生成子图&#xff1a;生成子图 G ’ G’ G’中顶点个数V’必须和原图G中V的数量相同&#xff0c;而 E ’ ∈ E E’∈E E’∈E即可。顶点集导出子图…