当前位置:首页 > C# > 正文

责任链模式详解(C#设计模式中的请求处理链机制)

在软件开发中,我们经常会遇到需要将一个请求沿着多个处理者传递的场景。比如审批流程、日志记录、权限验证等。这时候,责任链模式(Chain of Responsibility Pattern)就派上用场了。本文将用通俗易懂的方式,带你深入理解 C# 中的责任链模式,并通过完整示例代码帮助你掌握这一重要的行为型设计模式

什么是责任链模式?

责任链模式是一种行为型设计模式,它允许多个对象有机会处理同一个请求,从而避免请求的发送者与接收者之间的耦合。这些对象被连接成一条链,请求沿着这条链传递,直到有一个对象处理它为止。

责任链模式详解(C#设计模式中的请求处理链机制) 责任链模式 C#设计模式 行为型设计模式 请求处理链 第1张

为什么使用责任链模式?

  • 解耦请求发送者和接收者
  • 动态组合处理逻辑,灵活扩展
  • 符合“开闭原则”——对扩展开放,对修改关闭
  • 适用于多级审批、日志过滤、异常处理等场景

C# 实现责任链模式

下面我们通过一个“请假审批”系统来演示如何在 C# 中实现责任链模式。假设公司有三级审批:组长(≤2天)、经理(≤5天)、总监(>5天)。

1. 定义抽象处理器(Handler)

public abstract class Approver{    protected Approver nextApprover;    public void SetNext(Approver approver)    {        this.nextApprover = approver;    }    public abstract void ProcessRequest(LeaveRequest request);}

2. 定义请求类

public class LeaveRequest{    public string EmployeeName { get; set; }    public int Days { get; set; }    public LeaveRequest(string name, int days)    {        EmployeeName = name;        Days = days;    }}

3. 实现具体处理器(Concrete Handlers)

// 组长:可批准 ≤2 天public class TeamLeader : Approver{    public override void ProcessRequest(LeaveRequest request)    {        if (request.Days <= 2)        {            Console.WriteLine($"[组长] 批准了 {request.EmployeeName} 的 {request.Days} 天请假。");        }        else if (nextApprover != null)        {            Console.WriteLine($"[组长] 无法处理 {request.Days} 天的请假,转交上级。");            nextApprover.ProcessRequest(request);        }    }}// 经理:可批准 ≤5 天public class Manager : Approver{    public override void ProcessRequest(LeaveRequest request)    {        if (request.Days <= 5)        {            Console.WriteLine($"[经理] 批准了 {request.EmployeeName} 的 {request.Days} 天请假。");        }        else if (nextApprover != null)        {            Console.WriteLine($"[经理] 无法处理 {request.Days} 天的请假,转交总监。");            nextApprover.ProcessRequest(request);        }    }}// 总监:批准所有 >5 天的请假public class Director : Approver{    public override void ProcessRequest(LeaveRequest request)    {        Console.WriteLine($"[总监] 批准了 {request.EmployeeName} 的 {request.Days} 天请假。");    }}

4. 客户端使用示例

class Program{    static void Main(string[] args)    {        // 创建处理器        var teamLeader = new TeamLeader();        var manager = new Manager();        var director = new Director();        // 构建责任链        teamLeader.SetNext(manager);        manager.SetNext(director);        // 提交多个请假请求        var requests = new List<LeaveRequest>        {            new LeaveRequest("张三", 1),            new LeaveRequest("李四", 3),            new LeaveRequest("王五", 7)        };        foreach (var req in requests)        {            teamLeader.ProcessRequest(req);            Console.WriteLine();        }    }}

运行结果

[组长] 批准了 张三 的 1 天请假。[组长] 无法处理 3 天的请假,转交上级。[经理] 批准了 李四 的 3 天请假。[组长] 无法处理 7 天的请假,转交上级。[经理] 无法处理 7 天的请假,转交总监。[总监] 批准了 王五 的 7 天请假。

总结

通过上面的例子,我们可以看到责任链模式在 C# 中的优雅实现。它让每个处理器只关注自己的职责,同时通过链式调用实现灵活的流程控制。这种模式特别适合用于构建可扩展、可维护的请求处理链系统。

记住这四个核心SEO关键词责任链模式C#设计模式行为型设计模式请求处理链。 它们不仅有助于搜索引擎优化,也准确概括了本文的核心内容。

希望这篇教程能帮助你轻松掌握责任链模式!如果你觉得有用,欢迎分享给其他正在学习 C# 设计模式的朋友。