首页 > 编程语言 > C#设计模式17——责任链模式的写法

C#设计模式17——责任链模式的写法

时间:2023-05-09 22:45:47浏览次数:29  
标签:请求 17 C# request 处理 Handler 对象 HandleRequest 设计模式

是什么:

责任链模式是一种行为型设计模式,它允许对象组成一个链并依次检查另一个对象是否可以处理请求。如果一个对象可以处理请求,它处理请求,并且负责将请求传递给下一个对象,直到请求被处理为止。

为什么:

责任链模式可以降低系统中对象之间的耦合度,并提高系统的灵活性和可维护性。同时,它还可以减少了客户端与各个处理对象的耦合,使得客户端不需要知道哪个具体的处理对象来处理请求。

怎么做:

在责任链模式中,我们定义了一个抽象处理者接口 Handler,它定义了处理请求的方法 HandleRequest,并持有一个对下一个处理者的引用。接下来,我们定义了一些具体的处理者类 ConcreteHandlerA,ConcreteHandlerB 等,并实现了 Handler 接口中的 HandleRequest 方法。在具体实现中,每个处理者对象都能判断自己是否具备处理该请求的能力,如果能够处理,则直接处理;如果不能处理,则将请求转发给下一个处理者对象。如果到了链的末端,即没有任何一个处理者对象能够处理该请求,则该请求会被默认处理或者被丢弃。

下面是在 C# 语言中实现责任链模式的一个示例代码:

// 抽象处理者
public abstract class Handler
{
    protected Handler nextHandler; // 持有对下一个处理者的引用

    public void SetNextHandler(Handler nextHandler)
    {
        this.nextHandler = nextHandler;
    }

    public abstract void HandleRequest(int request);
}

// 具体处理者 A
public class ConcreteHandlerA : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 0 && request <= 10)
        {
            Console.WriteLine("ConcreteHandlerA 处理请求: " + request);
        }
        else if (nextHandler != null)
        {
            nextHandler.HandleRequest(request);
        }
        else
        {
            Console.WriteLine("无法处理请求: " + request);
        }
    }
}

// 具体处理者 B
public class ConcreteHandlerB : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 11 && request <= 20)
        {
            Console.WriteLine("ConcreteHandlerB 处理请求: " + request);
        }
        else if (nextHandler != null)
        {
            nextHandler.HandleRequest(request);
        }
        else
        {
            Console.WriteLine("无法处理请求: " + request);
        }
    }
}

// 具体处理者 C
public class ConcreteHandlerC : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 21 && request <= 30)
        {
            Console.WriteLine("ConcreteHandlerC 处理请求: " + request);
        }
        else if (nextHandler != null)
        {
            nextHandler.HandleRequest(request);
        }
        else
        {
            Console.WriteLine("无法处理请求: " + request);
        }
    }
}

在这个代码示例中,我们定义了一个抽象处理者 Handler,并在其中定义了一个对下一个处理者的引用 nextHandler。接下来,我们定义了三个具体处理者 ConcreteHandlerA,ConcreteHandlerB 和 ConcreteHandlerC,并实现了 Handler 接口中的 HandleRequest 方法。在 HandleRequest 方法中,每个具体处理者对象都会根据自己的能力判断是否能够处理该请求,如果能够处理,则直接处理;否则将请求转发给下一个处理者对象。

何时使用:

当一个系统需要处理一些请求,并且每个请求可以有多个处理者对象可以处理时,可以考虑采用责任链模式。此外,责任链模式还适用于系统中的对象具有强耦合关系时,将其解耦可以提高系统的灵活性和可维护性。

标签:请求,17,C#,request,处理,Handler,对象,HandleRequest,设计模式
From: https://www.cnblogs.com/for-easy-fast/p/17386572.html

相关文章

  • 随身wifi备份QCN
    备份qcn文件,需要先进行root,办法就是安装magisk,再刷一下修补过的boot文件就有root了。首先安装ardc,这是一个投屏软件,解决板子没有屏幕无法操作的问题,它的操作逻辑是鼠标左键为点击功能,右键为返回。安装完ardc后先别打开,检查一下任务管理器中,有adb或者androiddebugbridge程序在后......
  • [SWPUCTF 2021 新生赛]easyapp
    查壳:发现里边有个压缩包,弄出来看看:再查壳看看:啥也不是,把它扔进IDA:没有伪代码,一个字‘找’,关键点(是否IDA能成功反编译,还是说用了java的反编译才行,是否有flag或者CTF之类的字样):发现特殊字样,跟进:大写String?大胆点进jadx:成功,告诉我们什么?要大胆点,不然会浪费很多的时间:找......
  • c++打卡第二十一天
    一、爱因斯坦的数学题1、问题描述2、设计思路。①、输入N,从1到n遍历。②、寻找满足上述条件的数,得到符合条件的个数加一并打印出这个数。3、流程图4、代码实现#include<iostream>usingnamespacestd;intmain(){intN;intflag=1;intcount;whi......
  • C#设计模式15——观察者模式的写法
    是什么:观察者模式是一种设计模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象状态发生改变时,它的所有依赖者都能够得到相应的通知并作出相应的反应。观察者模式也被称为发布-订阅模式。为什么:观察者模式可以实现对象之间的松耦合,从而使得对象更容易扩展和维护。同时,......
  • Transformer 模型中的positional encoding(位置编码)计算理解(2)
            以下(以上)内容来自(参考):https://www.bilibili.com/video/BV1Di4y1c7Zm?p=2&vd_source=6292df769fba3b00eb2ff1859b99d79e  importnumpyasnpdefgetPositionEncoding(seq_len,dim,n=10000):##seq_len:序列长度##dim词向量的维......
  • 现代 C++:Lambda 表达式
    Lambda表达式(LambdaExpression)是C++11引入的一个“语法糖”,可以方便快捷地创建一个“函数对象”。从C++11开始,C++有三种方式可以创建/传递一个可以被调用的对象:函数指针仿函数(Functor)Lambda表达式函数指针函数指针是从C语言老祖宗继承下来的东西,比较原始,功能也比......
  • 第五章学习 循环结构,分支结构,break,continue,return的用法,接收用户数据的fmt.scanl
       packagemainimport"fmt"funcmain(){//实现功能,键盘录入学生age,name,grage,是否为vipvarageintfmt.Println("请录入年龄")//传入age地址的目的:scanln函数中,对地址的值进行改变,实际上是对age值进行改变fmt.Scanln(&age)varname......
  • Docker部署网易云音乐解灰无版权VIP音乐播放下载
    若服务器已搭建好Docker,则跳过输入搭建docker命令,回车执行,耐心等待安装完成curl-fsSLhttps://get.docker.com|bash-sdocker--mirrorAliyun执行一键部署命令dockerrun-dit\ -eENABLE_FLAC=true\ -eENABLE_LOCAL_VIP=svip\ -eBLOCK_ADS=true\ -eSEARCH_A......
  • C++ Lambda表达式的完整介绍
    c++在c++11标准中引入了lambda表达式,一般用于定义匿名函数,使得代码更加灵活简洁。lambda表达式与普通函数类似,也有参数列表、返回值类型和函数体,只是它的定义方式更简洁,并且可以在函数内部定义。什么是Lambda表达式最常见的lambda的表达式写法如下autoplus=[](intv1,int......
  • C++11 lambda表达式精讲
    lambda表达式是C++11最重要也最常用的一个特性之一,C#3.5和Java8中就引入了lambda表达式。 lambda来源于函数式编程的概念,也是现代编程语言的一个特点。C++11这次终于把lambda加进来了。 lambda表达式有如下优点:声明式编程风格:就地匿名定义目标函数或函数对......