C#设计模式之职责链模式示例详解

C#设计模式之职责链模式示例详解

什么是职责链模式

职责链模式是一种行为型模式,它能够将一个请求沿着多个对象链状传递,直到有一个对象处理该请求为止。这样的设计模式可以避免请求发送者与接收者之间的耦合,使得多个对象都有可能接收请求并处理它。

职责链模式的结构

这种模式通常包含一个抽象的处理者类,多个具体的处理者类,每个处理者类都包括一个指向下一个处理者的引用,一般情况下,责任链中的处理者对象都包含相同类型的操作。

职责链模式的示例

下面,我们将使用一些实际的例子来展示职责链模式的用法。首先,我们考虑一个文件上传的场景。在这种情况下,我们只允许上传特定类型的文件,例如图片、文本、音频、视频等等。

public abstract class UploadHandler
{
    protected UploadHandler _nextHandler;

    public void SetNextHandler(UploadHandler handler)
    {
        this._nextHandler = handler;
    }

    public abstract bool Handle(string fileType);
}

我们定义了一个抽象的上传处理者类UploadHandler,其中包括一个指向下一个处理者的引用,还有一个抽象的Handle方法用于处理上传的文件。下面为我们实现具体的上传处理者类。

public class ImageUploadHandler : UploadHandler
{
    public override bool Handle(string fileType)
    {
        if(fileType == "jpg" || fileType == "png")
        {
            Console.WriteLine("处理了图片文件!");
            return true;
        }
        if(this._nextHandler != null)
        {
            return this._nextHandler.Handle(fileType);
        }
        Console.WriteLine("不支持的文件类型!");
        return false;
    }
}

public class TextUploadHandler : UploadHandler
{
    public override bool Handle(string fileType)
    {
        if(fileType == "txt" || fileType == "doc")
        {
            Console.WriteLine("处理了文本文件!");
            return true;
        }
        if(this._nextHandler != null)
        {
            return this._nextHandler.Handle(fileType);
        }
        Console.WriteLine("不支持的文件类型!");
        return false;
    }
}

public class AudioUploadHandler : UploadHandler
{
    public override bool Handle(string fileType)
    {
        if(fileType == "mp3" || fileType == "wav")
        {
            Console.WriteLine("处理了音频文件!");
            return true;
        }
        if(this._nextHandler != null)
        {
            return this._nextHandler.Handle(fileType);
        }
        Console.WriteLine("不支持的文件类型!");
        return false;
    }
}

public class VideoUploadHandler : UploadHandler
{
    public override bool Handle(string fileType)
    {
        if(fileType == "mp4" || fileType == "avi")
        {
            Console.WriteLine("处理了视频文件!");
            return true;
        }
        if(this._nextHandler != null)
        {
            return this._nextHandler.Handle(fileType);
        }
        Console.WriteLine("不支持的文件类型!");
        return false;
    }
}

我们实现了四个不同类型的上传处理者类,每个类都重写了Handle方法,用于检查文件类型并处理上传的文件。如果有下一个处理者,则向下传递,否则返回不支持的文件类型。

最后,我们将实现一个用于测试的客户端类。

static void Main(string[] args)
{
    ImageUploadHandler imageHandler = new ImageUploadHandler();
    TextUploadHandler textHandler = new TextUploadHandler();
    AudioUploadHandler audioHandler = new AudioUploadHandler();
    VideoUploadHandler videoHandler = new VideoUploadHandler();

    imageHandler.SetNextHandler(textHandler);
    textHandler.SetNextHandler(audioHandler);
    audioHandler.SetNextHandler(videoHandler);

    Console.WriteLine(imageHandler.Handle("png"));
    Console.WriteLine(imageHandler.Handle("doc"));
    Console.WriteLine(imageHandler.Handle("mp3"));
    Console.WriteLine(imageHandler.Handle("mp4"));
    Console.WriteLine(imageHandler.Handle("xlsx"));
}

在这个测试客户端中,我们首先创建了四个上传处理者类的实例。然后,我们设置它们的处理顺序,并且将第一个处理者传递给客户端。最后,我们将测试多个文件的上传类型,每个文件都会经过一个处理者并返回结果,如果某个文件类型没有被处理,则会返回不支持的文件类型。

另一个职责链模式的示例

职责链模式的另一个示例是实现在线支付的场景。在这个场景中,我们需要使用多个支付方式,例如信用卡、支付宝、微信支付、银行转账等等。

abstract class PaymentHandler
{
    protected PaymentHandler _nextHandler;

    public void SetNextHandler(PaymentHandler handler)
    {
        this._nextHandler = handler;
    }

    public abstract bool Handle(double amount);
}

我们定义了一个抽象的支付处理者类PaymentHandler,其中包括一个指向下一个处理者的引用,还有一个抽象的Handle方法用于处理支付请求。下面为我们实现具体的支付处理者类。

public class CreditCardHandler : PaymentHandler
{
    public override bool Handle(double amount)
    {
        if(amount <= 1000)
        {
            Console.WriteLine("使用信用卡支付了 {0} 元", amount);
            return true;
        }
        if(this._nextHandler != null)
        {
            return this._nextHandler.Handle(amount);
        }
        Console.WriteLine("支付金额过大!");
        return false;
    }
}

public class AlipayHandler : PaymentHandler
{
    public override bool Handle(double amount)
    {
        if(amount <= 500)
        {
            Console.WriteLine("使用支付宝支付了 {0} 元", amount);
            return true;
        }
        if(this._nextHandler != null)
        {
            return this._nextHandler.Handle(amount);
        }
        Console.WriteLine("支付金额过大!");
        return false;
    }
}

public class WechatPayHandler : PaymentHandler
{
    public override bool Handle(double amount)
    {
        if(amount <= 300)
        {
            Console.WriteLine("使用微信支付了 {0} 元", amount);
            return true;
        }
        if(this._nextHandler != null)
        {
            return this._nextHandler.Handle(amount);
        }
        Console.WriteLine("支付金额过大!");
        return false;
    }
}

public class BankTransferHandler : PaymentHandler
{
    public override bool Handle(double amount)
    {
        Console.WriteLine("使用银行转账支付了 {0} 元", amount);
        return true;
    }
}

我们实现了四个不同类型的支付处理者类,每个类都重写了Handle方法,用于检查支付金额并处理支付请求。如果有下一个处理者,则向下传递,否则返回支付金额过大。

最后,我们将实现一个用于测试的客户端类。

static void Main(string[] args)
{
    CreditCardHandler creditCardHandler = new CreditCardHandler();
    AlipayHandler alipayHandler = new AlipayHandler();
    WechatPayHandler wechatPayHandler = new WechatPayHandler();
    BankTransferHandler bankTransferHandler = new BankTransferHandler();

    creditCardHandler.SetNextHandler(alipayHandler);
    alipayHandler.SetNextHandler(wechatPayHandler);
    wechatPayHandler.SetNextHandler(bankTransferHandler);

    Console.WriteLine(creditCardHandler.Handle(100));
    Console.WriteLine(creditCardHandler.Handle(600));
    Console.WriteLine(creditCardHandler.Handle(400));
    Console.WriteLine(creditCardHandler.Handle(2000));
}

在这个测试客户端中,我们首先创建了四个支付处理者类的实例。然后,我们设置它们的处理顺序,并且将第一个处理者传递给客户端。最后,我们将测试多个支付金额,每个支付请求都会经过一个处理者并返回结果,如果某个支付金额过大,则会返回支付金额过大。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#设计模式之职责链模式示例详解 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • CommunityToolkit.Mvvm8.1 消息通知(4)

    本系列文章导航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址)   希望提到的知识对您有所提示,同时欢迎交流和指正 作者:aierong出处:https://www.cnblogs.com/aierong   说明 为了…

    C# 2023年4月22日
    00
  • C# Clear():从 ICollection中移除所有元素

    C#Clear()方法详解 在C#中,Clear()是一个常用的方法,其函数签名为:public void Clear()。这个方法用于清除List集合中的所有元素,使其变为空集合。 具体而言,Clear()方法做两个主要方面的操作:删除所有元素,以及释放元素占用的存储空间。 下面,我们就详细介绍Clear()方法的使用。 基础用法 在 List 的对象上,…

    C# 2023年4月19日
    00
  • .Net弹性和瞬态故障处理库Polly介绍

    下面就给您详细讲解一下”.Net弹性和瞬态故障处理库Polly介绍”,这是一款.net生态中十分优秀的库,能够让开发者更好的处理瞬态故障和弹性处理,提高开发效率和用户体验。 Polly简介 什么是Polly? Polly(Polly.Extensions.Http)基于.NET Standard和.NET Core。Polly是.NET弹性和瞬态故障处理库,…

    C# 2023年5月15日
    00
  • c#程序删除自身代码示例分享

    下面是” C#程序删除自身代码示例分享”的完整攻略。 1. 实现原理 C#代码删除自身的实现原理是通过使用Process类的Start静态方法和ProcessStartInfo类来实现。Process类可以帮助你控制与其他进程交互的行为。 代码可以使用Process类的Start方法启动一个新的进程。这个新的进程可以是你自己的程序,也可以是其他的程序。可以使…

    C# 2023年5月15日
    00
  • C#开源类库SimpleTCP使用方法

    C#开源类库SimpleTCP使用方法 SimpleTCP是一款轻量级的C# TCP类库,主要用于帮助用户快速在C#应用程序中实现TCP通信。下面是SimpleTCP的使用方法: 概述 SimpleTCP可以用于开发TCP客户端和TCP服务端。作为客户端,它可以帮助你向远程TCP服务器发送数据并接收响应。作为服务端,它可以帮助你监听并处理来自客户端的请求。 …

    C# 2023年6月1日
    00
  • C#从实体对象集合中导出Excel的代码

    下面是详细讲解“C#从实体对象集合中导出Excel的代码”的完整攻略,包含两个示例说明。 1. 准备工作 在讲解具体的代码实现之前,需要先进行一些准备工作,包括安装需要的nuget包和导入命名空间。 1.1 安装nuget包 需要安装以下两个nuget包: ClosedXML DocumentFormat.OpenXml 可以使用Visual Studio的…

    C# 2023年5月31日
    00
  • C#使用DLLImport调用外部DLL的方法

    当我们需要使用C#调用外部的DLL库时,可以使用DLLImport属性,该属性可以将一个非托管DLL包装在托管类中。下面是详细的步骤: 1. 创建一个DLL库 首先,你需要创建一个非托管的DLL库,此处以C++语言为例,假设你已经创建了一个名为”test.dll”的库,其中包含了以下函数: #include <iostream> using na…

    C# 2023年6月7日
    00
  • C#编写SqlHelper类

    下面是关于” C#编写SqlHelper类”的完整攻略。 什么是SqlHelper类? SqlHelper类是.NET框架中一种用于操作数据库的辅助类,它提供了对SQL Server数据库的常用操作(增删改查等)实现方式。 使用SqlHelper类可以避免手动处理数据库的连接对象、命令对象等繁琐操作,从而提高开发效率和代码的复用性,是.NET Web开发中非…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部