C#职责链模式实例详解

C#职责链模式实例详解

什么是职责链模式

职责链模式是一种行为型设计模式,它允许您将请求沿着处理链进行传递,直到它被处理为止。职责链模式由以下角色组成:

  • 抽象处理程序:定义用于处理请求的通用接口,并保存指向其后继者的引用。
  • 具体处理程序:处理它所能处理的请求,可以访问其后继者,并向后继者委派无法处理的请求。
  • 客户端:将请求发送到处理程序以处理它。

具体的职责链模式的实现可以根据实际需求的不同而变化,但模式的结构通常是相似的。

C#职责链模式实现攻略

在C#中,可以通过以下步骤实现职责链模式:

  1. 创建抽象处理程序的接口,并定义处理请求的方法和保存后继者的引用的属性。

public interface IHandler
{
IHandler Successor { get; set; }
string HandleRequest(double request);
}

  1. 创建具体处理程序的类,并实现抽象处理程序接口,处理它所能处理的请求,并向后继者委派无法处理的请求。在实现中,可以根据实际需求的不同,对处理逻辑进行修改。

```
public class ConcreteHandler1 : IHandler
{
public IHandler Successor { get; set; }

   public string HandleRequest(double request)
   {
       if (request < 0.5)
       {
           return "ConcreteHandler1 handled the request.";
       }
       else
       {
           return Successor.HandleRequest(request);
       }
   }

}
```

  1. 在客户端代码中,创建具体处理程序的链,并将请求发送到处理程序以处理它。

```
var handler1 = new ConcreteHandler1();
var handler2 = new ConcreteHandler2();

handler1.Successor = handler2;

Console.WriteLine(handler1.HandleRequest(0.2));
```

实例1:经典面向对象设计问题

以下是一个经典的面向对象设计问题,可以用职责链模式来解决它。

假设有一个发票处理系统,根据发票的金额,需要选择不同的处理方式。对于发票金额小于100元的发票,由普通处理器进行处理;对于100元到1000元之间的发票,由中级处理器进行处理;对于大于1000元的发票,由高级处理器进行处理。

按照职责链模式的设计思路,可以创建一个IHandler接口作为抽象处理程序,然后创建具体处理程序来处理不同金额区间的发票,并将它们链接成处理程序链。

以下是实现的代码:

// 抽象处理程序接口
public interface IHandler
{
    IHandler Successor { get; set; }
    string HandleRequest(double request);
}

// 具体处理程序:处理1000元以上的发票
public class ExpertHandler : IHandler
{
    public IHandler Successor { get; set; }

    public string HandleRequest(double request)
    {
        if (request > 1000)
        {
            return "ExpertHandler handled the request.";
        }
        else
        {
            return Successor.HandleRequest(request);
        }
    }
}

// 具体处理程序:处理100元到1000元的发票
public class SeniorHandler : IHandler
{
    public IHandler Successor { get; set; }

    public string HandleRequest(double request)
    {
        if (request >= 100 && request <= 1000)
        {
            return "SeniorHandler handled the request.";
        }
        else
        {
            return Successor.HandleRequest(request);
        }
    }
}

// 具体处理程序:处理小于100元的发票
public class JuniorHandler : IHandler
{
    public IHandler Successor { get; set; }

    public string HandleRequest(double request)
    {
        if (request < 100)
        {
            return "JuniorHandler handled the request.";
        }
        else
        {
            return Successor.HandleRequest(request);
        }
    }
}

客户端代码可以这样写:

var junior = new JuniorHandler();
var senior = new SeniorHandler();
var expert = new ExpertHandler();

junior.Successor = senior;
senior.Successor = expert;

Console.WriteLine(junior.HandleRequest(50));       // JuniorHandler handled the request.
Console.WriteLine(junior.HandleRequest(500));      // SeniorHandler handled the request.
Console.WriteLine(junior.HandleRequest(5000));     // ExpertHandler handled the request.

实例2:请求静态文件

以下是另一个示例:使用职责链模式来请求静态文件。这个例子很简单,但足以说明职责链模式的优势。

实现的代码如下:

// 抽象处理程序接口
public interface IRequestHandler
{
    IRequestHandler Successor { get; set; }
    string HandleRequest(string request);
}

// 具体处理程序:请求css文件
public class CssRequestHandler : IRequestHandler
{
    public IRequestHandler Successor { get; set; }

    public string HandleRequest(string request)
    {
        if (request.EndsWith(".css", StringComparison.OrdinalIgnoreCase))
        {
            return "Handling css request";
        }
        else
        {
            return Successor.HandleRequest(request);
        }
    }
}

// 具体处理程序:请求js文件
public class JsRequestHandler : IRequestHandler
{
    public IRequestHandler Successor { get; set; }

    public string HandleRequest(string request)
    {
        if (request.EndsWith(".js", StringComparison.OrdinalIgnoreCase))
        {
            return "Handling js request";
        }
        else
        {
            return Successor.HandleRequest(request);
        }
    }
}

// 具体处理程序:请求html文件
public class HtmlRequestHandler : IRequestHandler
{
    public IRequestHandler Successor { get; set; }

    public string HandleRequest(string request)
    {
        if (request.EndsWith(".html", StringComparison.OrdinalIgnoreCase))
        {
            return "Handling html request";
        }
        else
        {
            return Successor.HandleRequest(request);
        }
    }
}

客户端代码可以这样写:

var cssHandler = new CssRequestHandler();
var jsHandler = new JsRequestHandler();
var htmlHandler = new HtmlRequestHandler();

cssHandler.Successor = jsHandler;
jsHandler.Successor = htmlHandler;

Console.WriteLine(cssHandler.HandleRequest("style.css"));            // Handling css request
Console.WriteLine(cssHandler.HandleRequest("script.js"));            // Handling js request
Console.WriteLine(cssHandler.HandleRequest("index.html"));           // Handling html request
Console.WriteLine(cssHandler.HandleRequest("page.aspx"));            // Unhandled request

总结

职责链模式是一种强大的设计模式,它允许您将请求沿着处理链进行传递,直到它被处理为止,从而使您的代码更加灵活和可扩展。在C#中,职责链模式的实现通常包括抽象处理程序接口、具体处理程序类和客户端代码。

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

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

相关文章

  • 如何在UpdatePanel中调用JS客户端脚本

    在 ASP.NET 中,可以使用 UpdatePanel 控件来实现局部异步刷新页面的效果。但是,默认情况下,UpdatePanel 不支持调用客户端JS脚本。本文就讲解如何在 UpdatePanel 中调用JS客户端脚本,通过两个示例帮助读者更好地理解。 方法一:使用ScriptManager类的RegisterStartupScript方法 在 Upda…

    C# 2023年6月6日
    00
  • Js 导出table内容到Excel的简单实例

    首先我会讲解如何通过js导出table内容到Excel。以下是完整的攻略: 准备工作 编写html页面,并在页面中创建一个table并填充数据 导入jquery、TableExport等库文件 步骤 加载TableExport插件库文件 <script src="js/FileSaver.min.js"></script…

    C# 2023年6月1日
    00
  • .NET使用一行命令轻松生成EF Core项目框架

    dotnet ef是Entity Framework Core(EF Core)的一个命令行工具,用于管理EF Core应用程序的数据库和代码。除了提供管理数据库的命令之外,dotnet ef还可以生成和管理实体和上下文代码。本文将介绍如何使用dotnet ef动态生成代码。 一、环境准备 1、项目准备 用vs2022新建一个.NET6的asp.net co…

    C# 2023年4月27日
    00
  • 简单介绍SQL Server中的自旋锁

    SQL Server是一种关系型数据库管理系统,其管理和保护数据的并发访问性是非常重要的。为了满足这个需求,SQL Server使用了锁机制,其中自旋锁是其中一种类型的锁。 什么是自旋锁 自旋锁是一种轻量级的锁类型,它采用了忙等待的方式来解决锁冲突,并避免了线程的上下文切换。当一个线程尝试获得自旋锁时,如果锁没有被占用,该线程会立即获得锁,并继续执行。如果锁…

    C# 2023年6月6日
    00
  • unity3d实现七天签到功能

    实现七天签到功能需要以下步骤: 步骤一:创建UI界面 首先,需要在Unity3D中创建一个UI界面,用于展示用户的签到记录和当天是否签到。可以使用Unity3D的内置UI工具,或者使用第三方插件,如NGUI。 步骤二:创建签到数据结构 在编写签到功能之前,需要定义一个签到的数据结构,保存用户的签到记录。可以用一个数组保存七天的签到状态,true表示已签到,f…

    C# 2023年6月1日
    00
  • asp.net(c#)ref,out ,params的区别

    那么让我们来详细讲解一下“asp.net(c#)ref,out ,params的区别”的完整攻略吧。 1. ref参数 ref参数用于将变量的引用传递给函数,这意味着如果在函数内修改了该变量,那么同样会修改函数外的原始变量。使用ref参数时,需要确保变量已经被初始化。 示例代码: void AddOne(ref int x) { x += 1; } int …

    C# 2023年6月7日
    00
  • ASP.NET Core使用EF查询数据

    下面是关于“ASP.NET Core使用EF查询数据”的完整攻略,分为以下几个部分: 环境配置 创建数据库 安装EF 使用EF查询数据 1. 环境配置 在使用ASP.NET Core开发前,需要进行环境配置,具体步骤如下: 安装Visual Studio 2017或更高版本 下载安装.NET Core SDK 安装ASP.NET Core模板 2. 创建数据…

    C# 2023年6月3日
    00
  • asp.net实现将ppt文档转换成pdf的方法

    将 ppt 文档转换成 PDF 是一个常见的需求,以下是 asp.net 实现将 ppt 文档转换成 PDF 的方法的完整攻略。 步骤 1:安装 Microsoft PowerPoint Interop 首先,您需要安装 Microsoft PowerPoint Interop 来处理 ppt 文件。通过安装 PowerPoint Interop,您可以将 …

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