模式开发 —— 责任链模式

本文深入探讨了责任链模式的概念及其在实际场景中的应用,通过具体实例展示了如何利用责任链模式简化请求处理流程,降低耦合度,提高代码的可维护性和扩展性。文中详细阐述了责任链模式的结构、实现方式及其实现过程,包括抽象处理者角色、具体处理者角色的设计与使用。并通过代码实例展示了如何构建责任链并处理不同等级的请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址 :http://www.unitymanual.com/blog-27799-3084.html


写写自己对这个设计模式的理解吧。


责任连模式(Chain of Responsibility)概述

在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1W的薪水可能技术经理就可以决定了,但是1W – 5W的薪水可能技术经理就没有这个权利批准,可能就需要请求技术总监的批准,所以在面试的完后,经常会有面试官说,你这个薪水我这边觉得你这个技术可以拿这个薪水的,但是还需要技术总监的批准等话,这个例子也就诠释了本文要介绍的内容。

 

定义:

责任链模式:某个请求需要多个对象进行处理,从而避免请求的发送者和接收之间的耦合关系。将这些对象连成一条链子,并沿着这条链子传递该请求,直到有对象处理它位置。

 

责任链模式结构:

责任链模式参与者:

抽象处理者角色(Handler):定义出一个处理请求的接口。这个接口通常由接口活抽象类来实现。

具体处理者角色(ConcreteHandler):具体处理者接受到请求后,可以选择将该请求处理掉,或者将请求传给下一个处理者。因此,每个具体处理者需要保存下一个处理这的引用,以便把请求传递下去。

 

责任链模式结构实现:

1、             /// <summary>

2、             /// 抽象处理类

3、             /// </summary>

4、             public abstract class Handler

5、             {

6、                       protected Handler successor;

7、     

8、                       public void SetSuccessor(Handler successor)

9、                       {

10、                            this.successor = successor;

11、                   }

12、 

13、                   public abstract void HandleRequest(int request);

14、 

15、         }

16、         /// <summary>

17、         /// C具体处理类

18、         /// </summary>

19、         public class ConcreteHandler1:Handler

20、         {

21、                   public override void HandleRequest(int request)

22、                   {

23、                            if (request >= 0 && request < 10)

24、                            {

25、                                     Console.WriteLine("{0} handled request{1}",this.GetType().Name,request);

26、                            }else if(successor!=null)

27、                            {

28、                                     successor.HandleRequest(request);

29、                            }

30、                   }

31、         }

32、         /// <summary>

33、         /// C具体处理类

34、         /// </summary>

35、         public class ConcreteHandler2:Handler

36、         {

37、                   public override void HandleRequest(int request)

38、                   {

39、                            if (request >= 10 && request < 20)

40、                            {

41、                                     Console.WriteLine("{0} handled request {1}",this.GetType().Name,request);

42、                            }else if(successor !=null)

43、                            {

44、                                     successor.HandleRequest(request);

45、                            }

46、                   }

47、         }

48、         /// <summary>

49、         /// C具体处理类

50、         /// </summary>

51、         public class ConcreteHandler3:Handler

52、         {

53、                   public override void HandleRequest(int request)

54、                   {

55、                            if(request>=20&&request<30)

56、                            {

57、                                     Console.WriteLine("{0} handled request{1}",this.GetType().Name,request);

58、                            }else if(successor !=null)

59、                            {

60、                                     successor.HandleRequest(request);

61、                            }

62、                   }

63、         }

64、    /// <summary>

65、    /// C客户端类

66、         /// </summary>

67、         class Client

68、         {

69、                   static void Main(string[] args)

70、                   {

71、                            Handler h1 = new ConcreteHandler1 ();

72、                            Handler h2 = new ConcreteHandler2 ();

73、                            Handler h3 = new ConcreteHandler3 ();

74、 

75、                            h1.SetSuccessor (h2);

76、                            h2.SetSuccessor (h3);

77、 

78、                            int[] requests = {2,5,14,22,18,3,27,20};

79、 

80、                            foreach(int request in requests)

81、                            {

82、                                     h1.HandleRequest(request);

83、                            }

84、 

85、                   }

86、         }


责任链模式对要求处理对象有对事件有响应事件,即处理事件。当满足自己的管辖范围时便做出响应的处理,如果不满足自己条件,则要将事件向上反馈,交给其他对象处理。这其实是明确了各个对象的处理范围,通过处理范围将原本判断操作较多的对象细分为功能相近的独立单元,各个独立单元间只有数据传递操作。这样降低了事件处理的耦合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值