设计模式学习笔记——职责链模式(Chain of Responsibility)
1.特点:将处理者排成链,沿链传递请求。(单请求,多处理)
2.概念:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
3.类图:
4.程序实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 职责链模式 { class Program { static void Main( string [] args) { //设置职责链上家与下家 Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); Handler h3 = new ConcreteHandler3(); h1.SetSuccessor(h2); h2.SetSuccessor(h3); int [] requests = { 2, 5, 14, 22, 18, 3, 27, 20 }; foreach ( int request in requests) { //循环给最小处理着提交请求,不同的数据由不同权限处理者处理 h1.HandleRequest(request); } Console.Read(); } } //Handler类,定义一个处理请示的接口 abstract class Handler { protected Handler successor; //设置继任者 public void SetSuccessor(Handler successor) { this .successor = successor; } //处理请求的抽象方法 public abstract void HandleRequest( int request); } //ConcreteHandler类,具体处理者类,处理它所负责的请求,可访问它的后继者,如果可处理该请求就处理它,否则就将该请求转发给它的后继者 //ConcreteHandler1类,当请求数在0到10之间则有权处理,否则转到下一位 class ConcreteHandler1:Handler { public override void HandleRequest( int request) { if (request >= 0 && request < 10) { Console.WriteLine( "{0}处理请求{1}" , this .GetType ().Name , request); } else if (successor != null ) { //转移到下一位 successor.HandleRequest(request); } } } //ConcreteHandler2类,当请求数在10到20之间则有权处理,否则转到下一位 class ConcreteHandler2 : Handler { public override void HandleRequest( int request) { if (request >= 10 && request < 20) { Console.WriteLine( "{0}处理请求{1}" , this .GetType().Name, request); } else if (successor != null ) { successor.HandleRequest(request); } } } //ConcreteHandler3类,当请求数在20到30之间则有权处理,否则转到下一位 class ConcreteHandler3 : Handler { public override void HandleRequest( int request) { if (request >= 20 && request < 30) { Console.WriteLine( "{0}处理请求{1}" , this .GetType().Name, request); } else if (successor != null ) { successor.HandleRequest(request); } } } } |
分类:
设计模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构