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日

相关文章

  • MVC 5 第一章 创建MVC 5 web应用程序

    下面是关于“MVC 5 第一章 创建MVC 5 web应用程序”的完整攻略,主要包含以下内容: 创建MVC 5 web应用程序的步骤 每个步骤所涉及到的具体操作 两条示例说明 1. 创建MVC 5 web应用程序的步骤 创建MVC 5 web应用程序的步骤主要包括以下几个方面: 创建项目 配置项目 创建控制器 创建模型 创建视图 2. 每个步骤所涉及到的具体…

    C# 2023年5月31日
    00
  • C#制作简单的多人在线即时交流聊天室

    这里是 C# 制作简单的多人在线即时交流聊天室的攻略。下面我们将分步骤介绍实现过程。 准备工作 编程环境:Visual Studio 2017 或更高版本。 知识储备:C# .NET 基础知识、Socket 编程、多线程编程、WinForm 界面开发等。 实现步骤 1. 创建 WinForm 应用程序 打开 Visual Studio,创建一个新的 WinF…

    C# 2023年6月1日
    00
  • Unity实现文本转贴图

    文本转贴图是游戏开发过程中常用的一种技术手段,它可以使得游戏中的文本内容更加丰富、生动,提高游戏的表现力。本文将详细介绍Unity如何实现文本转贴图。 1. 准备工作 1.1 导入相关资源 在Unity中我们需要使用Text Mesh Pro插件来实现文本转贴图。导入Text Mesh Pro插件后,我们需要将场景中需要转换的文本对象替换成TextMeshP…

    C# 2023年6月3日
    00
  • C#实现插入排序

    下面是关于C#实现插入排序的详细攻略。 什么是插入排序 插入排序是一种简单直观的排序算法,其基本思想是将待排序的数据分为已排序和未排序两部分,每次从未排序的部分中取出一个元素,将其插入到已排序的部分中,直到所有元素都插入完毕。 实现插入排序的步骤 实现插入排序算法的步骤如下: 定义一个数组作为待排序的数组。 遍历数组,开始排序。 对于每个遍历到的元素,将其与…

    C# 2023年6月6日
    00
  • C#多线程之Thread中Thread.Join()函数用法分析

    当我们使用C#中的多线程编程时,有时候需要在主线程中等待子线程完成后再继续执行。Thread.Join()函数就是用来实现这一功能的。本文将全面介绍Thread.Join()函数的用法及示例说明。 什么是Thread.Join()函数 Thread.Join()函数是Thread类中的一个方法,它的作用是阻塞主线程,直到当前线程执行完成。当调用Thread.…

    C# 2023年6月7日
    00
  • Asp.net mvc在view中用C#代码动态创建元素

    当我们在使用Asp.net mvc框架开发Web应用程序时,有时需要在View中动态生成Html元素,这时可以通过C#代码来实现。 下面是Asp.net mvc在view中用C#代码动态创建元素的完整攻略。 1.创建View 首先,在Asp.net mvc项目的Views文件夹下创建一个View,例如创建一个名为”DynamicCreate.cshtml”的…

    C# 2023年5月31日
    00
  • C#基础知识之this关键字介绍

    C#基础知识之this关键字介绍 概述 在C#中,this关键字用于指向当前实例对象。在类中,实例成员包括字段、属性、方法和构造函数,this关键字通常用于引用当前实例的成员。this关键字也可以在构造函数中使用,用于在构造函数中调用当前类的其他构造函数。 用法 引用实例成员 首先,我们来看下如何在C#类中使用this关键字引用实例成员。通常情况下,我们使用…

    C# 2023年5月31日
    00
  • 在 C# 中使用 插值字符串

    插值字符串是C#6.0版本中增加的一种字符串格式化方式,它可以方便地将变量直接嵌入字符串中,避免了传统字符串拼接的繁琐。以下是在C#中使用插值字符串的完整攻略: 插值字符串的基本格式 插值字符串的格式为$”{expression}”,其中expression是一个C#表达式。使用插值字符串时只需要将变量名或表达式包裹在{ }中即可。 示例1:使用插值字符串输…

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