c#中责任链模式详解

这篇具有很好参考价值的文章主要介绍了c#中责任链模式详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本介绍:

  “责任链”顾名思义,是指一个需要负责处理请求的链条

  每个链条节点都是一个单独的责任者,由责任者自己决定是否处理请求或交给下一个节点

  在设计模式中的解释则为:为请求创建了一个接收者对象的链。适用于有多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定的情况。

  俗话说起来就是一群领导组成了一个上下级链路关系,每个领导的职责各不相同,老百姓办事情的时候肯定没办法知道该找哪个领导。

  这个时候就可以把需要办的事情交给接待人员,由接待人员自行判断是不是可以处理或者交给上级处理,至于是谁给我负责,那我这个小老百姓并不关心,只要办了就可以了。

  老百姓办的事情就是请求,接待人员和领导群组成的集合就是责任链,每个领导负责自己的职责,至于最后是谁负责,那就根据具体事情一级一级的传递动态决定。

  这么做的好处也显而易见,我的请求可以是任意的,具体要不要解决由谁解决,都交给责任链自己去判断。

举例说明:

  公司的请假系统,当一个员工提交请假申请时,根据请假天数和职位的不同,需要由不同等级的领导审批。

  项目组长》部门经理》总经理》董事长》董事会就组成了一个责任链。

  普通员工和项目组长都是请假1天,但是由谁负责审批,交给责任链就可以了,由责任链自己决定由谁去审批。

  比如普通员工请假1天,只需要交给项目组长审批就可以。但如果是项目组长请假1天,需要交给部门经理审批。

  这种直接有单个责任人负责处理的称为纯的职责链模式

  一个请求必须被某一个处理者对象所接收,且一个具体处理者对某个请求的处理只能采用以下两种行为之一:自己处理或把责任提交给上级处理。

 

  如果普通员工请假1个月,项目组长一般没有直接审批的权限,需要先由项目组成初步审批,再由项目组长提交给部门经理进行审批。

  这种单个责任人负责部分责任的情况称为不纯的职责链模式

  允许出现某一个具体处理者对象在承担了请求的一部分责任后又将剩余的责任传给上级的情况,且一个请求可以最终不被任何接收端对象所接收。

 

  在一个纯的职责链模式里面,一个请求必须被某一个处理者对象所接收;

  在一个不纯的职责链模式里面,一个请求可以被多个处理者对象所处理或最终不被任何接收端对象所接收。

基本结构:

  抽象处理者角色:它定义一个处理请求的接口或抽象类,由于不同的具体处理者处理请求的方式不一样,因此在其中定义一个抽象的处理方法。同时该类需要维持一个指向上级的引用,通过该引用,处理者可以连成一条线。

  具体处理者角色:继承自抽象类,具体实现处理方法,在处理方法中进行处理或不满足职责向上级转发请求。

  客户端角色:负责链路组合顺序。

  请求者角色:构建请求对象。一般通过参数方式注入到具体处理类中。

优缺点:

  优点

  • 降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。
  • 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。
  • 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
  • 责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
  • 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

  缺点

  • 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
  • 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
  • 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。

具体实例:

  1     /// <summary>
  2     /// 请假条类
  3     /// </summary>
  4     public class LeaveRequest
  5     {
  6         //请假人
  7         public string Name { get; set; }
  8 
  9         //请假天数
 10         public int RestDaySum { get; set; }
 11 
 12         //职业等级
 13         public int Grade { get; set; }
 14 
 15         //构造函数中初始化请假信息
 16         public LeaveRequest(string strName, int iRestDaySum, int iGrade)
 17         {
 18             Name = strName;
 19             RestDaySum = iRestDaySum;
 20             Grade = iGrade;
 21         }
 22     }
 23 
 24     /// <summary>
 25     /// 抽象类
 26     /// </summary>
 27     public abstract class Approver
 28     {
 29         public Approver()
 30         {
 31             SetGrade();
 32         }
 33         //下一责任人引用
 34         protected Approver _Approver;
 35 
 36         //职业等级
 37         protected int Grade { get; set; }
 38 
 39         //设置下一个审批人,用来形成链路
 40         public void SetNextApprover(Approver approver)
 41         {
 42             this._Approver = approver;
 43         }
 44 
 45         //设置职业等级
 46         public abstract void SetGrade();
 47 
 48         //处理请求
 49         public abstract void ProcessRequest(LeaveRequest leaveRequest);
 50     }
 51 
 52     /// <summary>
 53     /// 具体实现类---组长
 54     /// </summary>
 55     public class GroupLeader : Approver
 56     {
 57         public override void ProcessRequest(LeaveRequest leaveRequest)
 58         {
 59             if (leaveRequest.Grade >= this.Grade)
 60             {
 61                 Console.WriteLine(leaveRequest.Name + "的请假条,组长无权处置!交由上级审核!");
 62                 _Approver.ProcessRequest(leaveRequest);
 63             }
 64             else
 65             {
 66                 if (leaveRequest.RestDaySum > 3)
 67                 {
 68                     Console.WriteLine(leaveRequest.Name + "的请假条,请假天数超出组长的职权,交由上级审核!");
 69                     _Approver.ProcessRequest(leaveRequest);
 70                 }
 71                 else
 72                 {
 73                     Console.WriteLine(leaveRequest.Name + "的请假条,经由组长审核通过,批准休假。");
 74                 }
 75             }
 76         }
 77 
 78         public override void SetGrade()
 79         {
 80             this.Grade = 2;
 81         }
 82     }
 83 
 84     /// <summary>
 85     /// 具体实现类---部门经理
 86     /// </summary>
 87     public class Manager : Approver
 88     {
 89         public override void ProcessRequest(LeaveRequest leaveRequest)
 90         {
 91             if (leaveRequest.Grade >= this.Grade)
 92             {
 93                 Console.WriteLine(leaveRequest.Name + "的请假条,部门经理无权处置!交由上级审核!");
 94                 _Approver.ProcessRequest(leaveRequest);
 95             }
 96             else
 97             {
 98                 if (leaveRequest.RestDaySum > 7)
 99                 {
100                     Console.WriteLine(leaveRequest.Name + "的请假条,请假天数超出部门经理的职权,交由上级审核!");
101                     _Approver.ProcessRequest(leaveRequest);
102                 }
103                 else
104                 {
105                     Console.WriteLine(leaveRequest.Name + "的请假条,经由部门经理审核通过,批准休假。");
106                 }
107             }
108         }
109 
110         public override void SetGrade()
111         {
112             this.Grade = 3;
113         }
114     }
115 
116     /// <summary>
117     /// 具体实现类---总经理
118     /// </summary>
119     public class GeneralManager : Approver
120     {
121         public override void ProcessRequest(LeaveRequest leaveRequest)
122         {
123             if (leaveRequest.Grade >= this.Grade)
124             {
125                 Console.WriteLine(leaveRequest.Name + "的请假条,总经理无权处置!交由上级审核!");
126                 _Approver.ProcessRequest(leaveRequest);
127             }
128             else
129             {
130                 if (leaveRequest.RestDaySum > 30)
131                 {
132                     Console.WriteLine(leaveRequest.Name + "的请假条,请假天数超出总经理的职权,交由上级审核!");
133                     _Approver.ProcessRequest(leaveRequest);
134                 }
135                 else
136                 {
137                     Console.WriteLine(leaveRequest.Name + "的请假条,经由总经理审核通过,批准休假。");
138                 }
139             }
140         }
141 
142         public override void SetGrade()
143         {
144             this.Grade = 4;
145         }
146     }
147 
148     /// <summary>
149     /// 客户端
150     /// </summary>
151     class Client
152     {
153         static void Main(string[] args)
154         {
155             //创建组长责任人
156             Approver groupLeader = new GroupLeader();
157             //创建部门经理责任人
158             Approver manager = new Manager();
159             //创建总经理责任人
160             Approver generalManager = new GeneralManager();
161 
162             //设置组长的上级为部门经理
163             groupLeader.SetNextApprover(manager);
164             //设置部门经理的上级为总经理
165             manager.SetNextApprover(generalManager);
166 
167             //通过以上操作构建了责任链
168 
169             //创建请求---请假条---普通职员张三请假3天
170             LeaveRequest leaveRequest = new LeaveRequest("张三", 3, 1);
171             //将请假条交给责任链起始端
172             groupLeader.ProcessRequest(leaveRequest);
173             Console.WriteLine("\r\n");
174 
175             //创建请求---请假条---部门经理李四请假3天
176             leaveRequest = new LeaveRequest("李四", 3, 3);
177             //将请假条交给责任链起始端
178             groupLeader.ProcessRequest(leaveRequest);
179             Console.WriteLine("\r\n");
180 
181 
182             //创建请求---请假条---普通职员小王请假7天
183             leaveRequest = new LeaveRequest("小王", 7, 1);
184             //将请假条交给责任链起始端
185             groupLeader.ProcessRequest(leaveRequest);
186             Console.WriteLine("\r\n");
187 
188             //如果知道链条的初始端可以不用从最开始端进行
189             //创建请求---请假条---组长老刘请假3天
190             leaveRequest = new LeaveRequest("老刘", 3, 2);
191             //将请假条交给责任链中的部门经理
192             manager.ProcessRequest(leaveRequest);
193             Console.WriteLine("\r\n");
194 
195             Console.ReadKey();
196         }
197     }

c#中责任链模式详解

总结:

  责任链模式属于行为型模式。它使多个对象都有机会处理请求,从而避免发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。文章来源地址https://www.toymoban.com/news/detail-746168.html

到了这里,关于c#中责任链模式详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【设计模式】第十五章:责任链模式详解及应用案例

    【设计模式】七大设计原则 【设计模式】第一章:单例模式 【设计模式】第二章:工厂模式 【设计模式】第三章:建造者模式 【设计模式】第四章:原型模式 【设计模式】第五章:适配器模式 【设计模式】第六章:装饰器模式 【设计模式】第七章:代理模式 【设计模式

    2024年02月13日
    浏览(35)
  • Java设计模式之责任链模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设计模式之责任链模式 OA系统采购审批需求 传统方案解决OA系

    2024年02月06日
    浏览(28)
  • 《设计模式》责任链模式

    定义 : 责任链模式将链中每一个节点都看成一个对象,并且将这些节点对象连成一条链,请求会沿着这条链进行传递,直到有对象处理它为止,这使得多个对象都有机会接收请求,避免了请求发送者和接收者之间的耦合。 属于 行为型 设计模式。 责任链模式的角色组成 :

    2024年02月13日
    浏览(36)
  • 设计模式—责任链模式

    一、待解决问题 : 减少代码中 if else 语句,降低代码圈复杂度或深度,增强可读性。 1、需求背景: 采购订单创建,需要验证采购员、物料、供应商、供应商的银行账号等信息。如采购员权限到期、或供应商失效等问题,都无法下单。 2、代码如下: 学习使用责任链模式后

    2024年02月10日
    浏览(32)
  • 设计模式-责任链模式

    遇到一个面试的场景题目,让实现税率的计算 请使用Java语言实现如下税率计算: 1~5000 税率 0 5001~8000 3% 8001~17000 10% 17001~30000 20% 30001~40000 25% 40001~60000 30% 60001~85000 35% 85001~ 45% 要求 ⅰ. 逻辑正确,代码优雅 ⅱ. 可扩展性,考虑区间的变化,比如说起征点从5000变成10000等等,或者

    2024年02月11日
    浏览(25)
  • 【设计模式】责任链模式

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处

    2024年02月12日
    浏览(31)
  • 设计模式:责任链模式

    责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象按照顺序处理请求,直到其中一个对象能够处理该请求为止。责任链模式将请求发送者和接收者解耦,使得多个对象都有机会处理请求,同时避免了请求发送者与接收者之间的直接耦合关系。 在

    2024年02月07日
    浏览(37)
  • 设计模式——责任链模式

    使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有对象处理它为止。 优点 能将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦提高系

    2024年02月15日
    浏览(33)
  • 行为型模式 - 责任链模式

    在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就

    2024年02月17日
    浏览(23)
  • 行为型模式-责任链模式

    概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,

    2024年02月02日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包