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日

相关文章

  • C# TryGetValue(TKey,TValue):获取具有指定键的值

    C#中的TryGetValue(TKey,TValue)是一个可以用于Dictionary类的方法。该方法的作用是获取指定键所对应的值,如果不存在则返回默认值。下面是该方法的完整攻略。 方法语法 Dictionary类型的TryGetValue()方法有如下两个重载形式: public bool TryGetValue(TKey key, out TValu…

    C# 2023年4月19日
    00
  • 一文带你快速学会C#中WinForm框架的使用详解

    标题:一文带你快速学会C#中WinForm框架的使用详解 简介 在本文中,我将全面介绍C#中WinForm框架的使用,包括窗体的基本操作、控件的使用、事件的处理等内容。 窗体的基本操作 创建窗体 在C#中创建一个Windows窗体非常简单,只需要借助Visual Studio创建Windows Form应用即可。 窗体属性设置 在Windows窗体中,有很多…

    C# 2023年5月31日
    00
  • c#中判断类是否继承于泛型基类

    要判断一个类是否继承于泛型基类,可以使用C#中的Type类和反射机制。 首先,使用Type类获取这个类的Type对象,然后使用Type对象的IsSubclassOf方法判断这个类是否继承于泛型基类。IsSubclassOf方法需要一个参数,即要判断的基类的Type对象。下面是一个示例代码: using System; class Program { stat…

    C# 2023年5月15日
    00
  • C#代码实现对AES加密解密

    下面是C#代码实现对AES加密解密的完整攻略。 1. 引入所需的命名空间 在C#代码实现对AES加密解密之前,我们需要先引入所需的命名空间。对于AES加密解密,我们需要引入System.Security.Cryptography命名空间。 using System.Security.Cryptography; 2. 生成密钥和向量 在进行AES加密解密之前,…

    C# 2023年6月8日
    00
  • C#实现的字符串相似度对比类

    C#实现的字符串相似度对比类一般由两个核心算法实现:Levenshtein Distance和Jaro-Winkler Distance。这两种算法分别可以衡量两个字符串的相似度,可以用于文本匹配、内容过滤、输入纠错等多种场景。 以下是一些实现C#字符串相似度对比类的步骤: 1.定义字符串比较类和相关算法要实现字符串相似度对比,首先需要定义一个字符串比较类,…

    C# 2023年6月1日
    00
  • jQuery与Ajax以及序列化

    jQuery是一个JavaScript库,它简化了JavaScript的编写,提供了许多实用的功能。其中,Ajax和序列化是jQuery中常用的两个功能。本文将提供使用jQuery进行Ajax请求和序列化的完整攻略,包括创建Ajax请求、序列化表单数据、处理响应等。同时,本文还提供两个示例,演示如何使用jQuery进行Ajax请求和序列化表单数据。 创建Aj…

    C# 2023年5月15日
    00
  • C# 动态加载程序集信息

    C# 动态加载程序集信息是指在程序运行中,动态地从文件系统或网络中加载程序集信息,然后使用反射技术获取程序集中的类型信息并进行调用。这种动态加载程序集信息的方法通常用于实现插件式架构、程序集延迟加载等功能。 实现C# 动态加载程序集信息的步骤如下: 加载程序集 使用Assembly.Load方法,可以从文件系统或网络中加载程序集。如下面的代码: Assemb…

    C# 2023年6月1日
    00
  • asp.net(C#)函数对象参数传递的问题

    ASP.NET是一种基于.NET框架的Web应用程序开发技术,而C#是一种强类型的编程语言。在ASP.NET(C#)中,函数对象参数传递是必不可少的组成部分。本文将详细介绍如何处理ASP.NET(C#)函数对象参数传递的问题。 什么是函数对象参数传递? 函数对象参数传递是指在C#中传递函数对象作为参数的过程。这种方式可以让我们更加灵活地处理业务逻辑,实现不同…

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