责任链模式(Chain of Responsibility)是一种行为设计模式,允许将请求沿着处理链传递,直到有一个处理者处理该请求。每个处理者决定自己是否处理请求或传递给链中的下一个处理者。以下是一个在.NET Core中实现责任链模式的详细示例。
模式结构
- 抽象处理者(Handler):定义处理请求的接口,并维护下一个处理者的引用。
- 具体处理者(Concrete Handler):实现处理逻辑,决定是否处理请求或传递请求。
- 请求类(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中的实现方式。
897

被折叠的 条评论
为什么被折叠?



