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日

相关文章

  • 一些.NET对多线程异常处理技巧分享

    一些.NET对多线程异常处理技巧分享 前言 在多线程编程过程中,异常处理通常是一个很容易被忽视的问题,它对程序的稳定性和可靠性有着关键的影响。本文将对多线程异常处理中所需要注意的问题进行讨论,并分享一些.NET对多线程异常处理技巧。 1. 对于多线程处理不可避免的异常 在多线程处理过程中,我们很难避免出现一些不可避免的异常,比如线程间互相通信的异常等。针对这…

    C# 2023年5月15日
    00
  • 在ASP.NET 2.0中操作数据之七十四:用Managed Code创建存储过程和用户自定义函数(下部分)

    标题:在ASP.NET 2.0中操作数据之七十四:用Managed Code创建存储过程和用户自定义函数(下部分) 在ASP.NET 2.0中,我们可以使用Managed Code来创建存储过程和用户自定义函数,使用此功能可以提高数据操作的效率和安全性。 下面是使用Managed Code创建存储过程和用户自定义函数的步骤: 创建一个新的类,并给类加上pub…

    C# 2023年5月31日
    00
  • 利用C#实现网络爬虫

    利用C#实现网络爬虫攻略 背景介绍 网络爬虫是一种获取互联网信息的方法。在我们日常使用互联网时,我们通过浏览器访问网站后查看相关的内容。而网络爬虫则是模拟访问网站并将有用的信息提取出来。利用网络爬虫可以快速、自动地收集大量的数据,有很大的应用价值。C#作为一种流行的编程语言,也可以用来实现网络爬虫。 网络爬虫的基本流程 利用C#实现网络爬虫,其实就是模拟浏览…

    C# 2023年6月6日
    00
  • js使用html2canvas实现屏幕截取的示例代码

    html2canvas是一个JavaScript库,可以将网页中的任何部分转换为Canvas图像。在本文中,我们将介绍如何使用html2canvas实现屏幕截取的示例代码。 示例1:截取整个屏幕 在这个示例中,我们将演示如何使用html2canvas截取整个屏幕。 在HTML文件中引入html2canvas库。在标签中添加以下代码: <script s…

    C# 2023年5月15日
    00
  • ASP.NET 生成静态页面 实现思路

    以下是关于“ASP.NET 生成静态页面 实现思路”的完整攻略。 什么是ASP.NET生成静态页面 在ASP.NET中,页面的内容通常是由ASP.NET引擎动态生成的。当用户请求ASPX页面时,服务器端ASP.NET引擎会解析页面中的代码,并将其转换为HTML代码,最终呈现在用户的浏览器中。但是,这种动态生成的方式会增加服务器的负担,并且对于搜索引擎的抓取也…

    C# 2023年6月3日
    00
  • Json.Net6.0用法介绍

    Json.Net6.0用法介绍 简介 Json.Net是一个开源的、高性能的Json框架,支持将Json与.Net对象相互转换。本篇攻略将讲述Json.Net6.0的用法介绍。 安装 可以通过NuGet进行安装,或者从官网下载最新的安装程序。 在Visual Studio中可以通过NuGet控制台输入以下命令进行安装: Install-Package New…

    C# 2023年5月31日
    00
  • C++ 和 C# 中的 lambda的方法技巧

    C++和C#中lambda表达式都是一种可以在运行时定义匿名函数的语法,它所属的范畴属于闭包。在函数式编程中,lambda表达式可以替代匿名函数来传递操作。下面将分别对C++和C#中的lambda表达式进行详细讲解。 C++中的lambda表达式 在C++11中,lambda表达式的语法为: [capture list] (parameters) ->…

    C# 2023年5月15日
    00
  • C#中使用@声明变量示例(逐字标识符)

    C#中使用@声明变量的方式又被称为逐字(verbatim)标识符。这种方式可以避免C#关键字与变量名冲突的问题,同时也支持在字符串中直接输出换行符和制表符等特殊字符,非常实用。下面我们详细讲解一下如何使用@声明变量。 基本语法 使用@声明变量的基本语法如下: @变量名 = 值 其中,@符号紧贴变量名,表示对变量名进行逐字标识符声明。 示例一 下面来看一个简单…

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