责任链模式(Chain of Responsibility)

责任链模式(Chain of Responsibility)是一种行为设计模式,允许将请求沿着处理链传递,直到有一个处理者处理该请求。每个处理者决定自己是否处理请求或传递给链中的下一个处理者。以下是一个在.NET Core中实现责任链模式的详细示例。

模式结构

  1. 抽象处理者(Handler):定义处理请求的接口,并维护下一个处理者的引用。
  2. 具体处理者(Concrete Handler):实现处理逻辑,决定是否处理请求或传递请求。
  3. 请求类(Request):封装请求的详细信息。

示例场景:请假审批流程

  • 请假1-3天:由组长审批。
  • 请假4-7天:由经理审批。
  • 请假8天及以上:由CEO审批。

实现步骤

1. 定义请求类
public class LeaveRequest
{
    public int Days { get; set; }

    public LeaveRequest(int days)
    {
        Days = days;
    }
}
2. 定义抽象处理者
public abstract class Handler
{
    protected Handler nextHandler;

    public void SetNext(Handler handler)
    {
        nextHandler = handler;
    }

    public abstract void HandleRequest(LeaveRequest request);
}
3. 实现具体处理者

GroupLeaderHandler(组长处理者)

public class GroupLeaderHandler : Handler
{
    public override void HandleRequest(LeaveRequest request)
    {
        if (request.Days >= 1 && request.Days <= 3)
        {
            Console.WriteLine($"组长审批通过,请假天数:{request.Days}");
        }
        else if (nextHandler != null)
        {
            nextHandler.HandleRequest(request);
        }
        else
        {
            Console.WriteLine("无人处理该请求");
        }
    }
}

ManagerHandler(经理处理者)

public class ManagerHandler : Handler
{
    public override void HandleRequest(LeaveRequest request)
    {
        if (request.Days >= 4 && request.Days <= 7)
        {
            Console.WriteLine($"经理审批通过,请假天数:{request.Days}");
        }
        else if (nextHandler != null)
        {
            nextHandler.HandleRequest(request);
        }
        else
        {
            Console.WriteLine("无人处理该请求");
        }
    }
}

CEOHandler(CEO处理者)

public class CEOHandler : Handler
{
    public override void HandleRequest(LeaveRequest request)
    {
        if (request.Days >= 8)
        {
            Console.WriteLine($"CEO审批通过,请假天数:{request.Days}");
        }
        else if (nextHandler != null)
        {
            nextHandler.HandleRequest(request);
        }
        else
        {
            Console.WriteLine("无人处理该请求");
        }
    }
}
4. 客户端调用
class Program
{
    static void Main(string[] args)
    {
        // 构建责任链
        var groupLeader = new GroupLeaderHandler();
        var manager = new ManagerHandler();
        var ceo = new CEOHandler();

        groupLeader.SetNext(manager);
        manager.SetNext(ceo);

        // 测试不同的请假天数
        var requests = new[] { 2, 5, 9, 0 };
        foreach (var days in requests)
        {
            Console.WriteLine($"处理请假申请,天数:{days}");
            var request = new LeaveRequest(days);
            groupLeader.HandleRequest(request);
            Console.WriteLine();
        }
    }
}

输出结果

处理请假申请,天数:2
组长审批通过,请假天数:2

处理请假申请,天数:5
经理审批通过,请假天数:5

处理请假申请,天数:9
CEO审批通过,请假天数:9

处理请假申请,天数:0
无人处理该请求

责任链模式优缺点

优点

  • 解耦:发送者无需知道具体处理者。
  • 灵活:可动态调整处理链,符合开闭原则。

缺点

  • 请求可能未被处理:需确保链的完整性。
  • 性能影响:长链可能导致延迟。

应用场景

  • 多级审批流程(如请假、报销)。
  • 事件处理系统(如日志处理、异常捕获)。
  • 中间件管道(如ASP.NET Core中间件)。

通过此示例,可以清晰理解责任链模式的工作原理及其在.NET Core中的实现方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gene Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值