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日

相关文章

  • C#编程调用Cards.dll实现图形化发牌功能示例

    C#编程调用Cards.dll实现图形化发牌功能示例 一、背景介绍 随着计算机的不断普及,越来越多的人选择使用电脑进行休闲娱乐。而纸牌游戏作为一种简单、有趣的休闲游戏,在计算机上得到了广泛的应用。本篇攻略主要介绍了C#编程调用Cards.dll实现图形化发牌功能的方法。 二、技术点介绍 C#编程语言:C#是一种面向对象的编程语言,它不仅继承了C++语言的特点…

    C# 2023年6月7日
    00
  • 详解.NET Core 3.0 里新的JSON API

    在本攻略中,我们将详细讲解.NET Core 3.0中新的JSON API,并提供两个示例说明。 安装Microsoft.AspNetCore.Mvc.NewtonsoftJson:首先,我们需要安装Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet包。我们可以使用Visual Studio的Get包管理器来安装Mic…

    C# 2023年5月16日
    00
  • Entity Framework Core种子数据Data-Seeding

    Entity Framework Core 种子数据(Data Seeding)可以帮助开发者在应用程序中使用预定义的数据填充数据库。本篇文章将从概览、设计、实现等方面详细地介绍 Entity Framework Core 种子数据的完整攻略,包括,如何配置数据模型和 DbContext,如何添加种子数据,以及如何在应用启动时自动应用种子数据等。 1. 概述…

    C# 2023年6月3日
    00
  • C#中使用Interlocked进行原子操作的技巧

    C# 中使用 Interlocked 进行原子操作的技巧 Interlocked 类是一个提供了一些原子操作的类型,可以用来进行多线程编程中的非阻塞同步,解决并发冲突的问题。Interlocked 类提供了一些原子操作,包括自增、自减、交换、比较和交换等操作。在 C# 中使用 Interlocked 进行原子操作有一些技巧,下面就进行详细讲解: 初始化 首先…

    C# 2023年6月6日
    00
  • 关于C# 类和对象详情

    关于C# 类和对象详情 类 在C#中,类是一种用于封装数据和行为的模板。它定义了一个对象的属性和方法,对象是类的实例。 声明类 定义一个类,需要使用class关键字后接类名。类名通常使用大写字母开头。 public class Person { // 属性和方法声明 } 属性 属性是类中包含的一种变量,其定义形式为访问修饰符 类型 属性名 { get; se…

    C# 2023年5月31日
    00
  • 枚举的用法详细总结

    枚举的用法详细总结 枚举(Enumeration)是一种常用的数据类型,它可以定义一些有限的取值范围。枚举常用于程序中对一些离散的状态或类型的定义,也方便了程序的维护和理解。在本文中,我们将介绍枚举的定义、初始化、遍历以及一些常见的用法。 定义枚举 定义枚举可以使用C++11引入的关键字enum class,其语法如下: enum class 枚举名 { 枚…

    C# 2023年6月8日
    00
  • C#使用LINQ查询操作符实例代码(一)

    “C#使用LINQ查询操作符实例代码(一)”是一篇介绍C#中使用LINQ查询操作符的教程,该教程共包含以下几个部分: 简介 常见的查询操作符 LINQ查询操作符实例代码 下面分别对这几个部分进行详细讲解。 简介 该部分简单介绍了LINQ的定义和作用,以及本篇教程的目的和使用前提。重点在于说明了本教程需要读者具备一定的C#基础知识和对LINQ技术的了解。 常见…

    C# 2023年5月31日
    00
  • ASP.NET Core模仿中间件方式实现列表过滤功能

    ASP.NET Core模仿中间件方式实现列表过滤功能攻略 在ASP.NET Core中,可以使用中间件来实现列表过滤功能。本攻略将提供详细的步骤和示例说明,演示如何在ASP.NET Core中实现列表过滤功能。 步骤 步骤1:创建一个新的ASP.NET Core Web应用程序 首先,需要创建一个新的ASP.NET Core Web应用程序。可以使用以下命…

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