23_责任链模式
责任链模式是一种行为设计模式,它可以将请求的发送者和接收者解耦,并且允许多个对象都有机会处理请求。
在责任链模式中,每个处理者都持有对下一个处理者的引用,形成一个链条。当请求发出时,从链条的头部开始,每个处理者都有机会处理请求。如果某个处理者能够处理请求,它就会处理请求并结束,否则将请求传递给下一个处理者,直到有一个处理者能够处理请求或者到达链条的末尾。
责任链模式包含以下几个角色:
-
抽象处理者(Handler):定义了处理请求的接口,并持有对下一个处理者的引用。
-
具体处理者(Concrete Handler):实现了处理请求的方法,并决定是否能够处理请求。
责任链模式的工作流程如下:
-
创建具体处理者对象,并确定它们的处理顺序。
-
将具体处理者按照顺序连接成一条链。
-
发送请求给链条的头部处理者。
-
头部处理者根据自己的逻辑判断是否能够处理请求,如果能够处理,则处理请求并结束;如果不能处理,则将请求传递给下一个处理者。
-
重复步骤4,直到有一个处理者能够处理请求或者到达链条的末尾。
责任链模式的优点包括:
-
解耦了请求的发送者和接收者,使得系统更加灵活和可扩展。
-
可以动态地添加、修改和删除处理者,灵活地调整处理链的结构。
-
可以避免请求的发送者和接收者之间的耦合,使系统更加符合单一职责原则。
责任链模式适用于以下情况:
-
有多个对象可以处理请求,但是不确定哪个对象能够处理请求,或者可以处理请求的对象会随着时间的推移而改变。
-
需要在不同的对象之间动态地传递请求。
-
需要将请求的发送者和接收者解耦,提高系统的灵活性和可扩展性。
总之,责任链模式是一种将请求的发送者和接收者解耦的设计模式,它可以形成一个处理链条,每个处理者都有机会处理请求。这种模式可以提高系统的灵活性和可扩展性,适用于处理复杂的请求逻辑。
案例场景:订单审核,经理,总监,副总裁
/// <summary> /// 需要处理的请求,需要审核的订单 /// 经理<=5000,总监<=10000,副总裁<=50000 /// </summary> public class Order { public int Id { get; set; } public string Name { get; set; } /// <summary> /// 金额 /// </summary> public int Amount { get; set; } }
Handler
/// <summary> /// 抽象处理器 /// </summary> public abstract class HandlerBase { /// <summary> /// 是否同意 /// </summary> /// <param name="order"></param> public abstract void Approve(Order order); /// <summary> /// 下一个签字人 /// </summary> public HandlerBase NextHandler { get;private set; } /// <summary> /// 设置下一个签字人 /// </summary> /// <param name="nextHandler"></param> public virtual void SetNextHandler(HandlerBase nextHandler) { NextHandler = nextHandler; } }
Concrete Handler
/// <summary> /// 经理 /// </summary> public class Manager : HandlerBase { public override void Approve(Order order) { if(order!=null) { if(order.Amount<=5000) { Console.WriteLine("经理审核成功"); } else { if(NextHandler!=null) { NextHandler.Approve(order); } else { Console.WriteLine("审核不存在"); } } } else { throw new Exception("订单不能为空"); } } }
/// <summary> /// 总监 /// </summary> public class Director : HandlerBase { public override void Approve(Order order) { if (order != null) { if (order.Amount <= 10000) { Console.WriteLine("总监审核成功"); } else { if (NextHandler != null) { NextHandler.Approve(order); } else { Console.WriteLine("审核不存在"); } } } else { throw new Exception("订单不能为空"); } } }
/// <summary> /// 副总裁 /// </summary> public class VicePresident : HandlerBase { public override void Approve(Order order) { if (order != null) { if (order.Amount <= 50000) { Console.WriteLine("副总裁审核成功"); } else { Console.WriteLine("CEO审核"); } } else { throw new Exception("订单不能为空"); } } }
调用
internal class Client { public void Start() { HandlerBase manager = new Manager(); HandlerBase director=new Director(); HandlerBase vicePresident= new VicePresident(); manager.SetNextHandler(director); director.SetNextHandler(vicePresident); Order order = new Order() { Id = 1, Name = "张三", Amount = 52000 }; manager.Approve(order); } }
static void Main(string[] args) { new Client().Start(); Console.ReadKey(); Console.WriteLine("Hello, World!"); }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体