责任链模式(管理流程)

责任链模式(Chain of Responsibility):

  使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一对像处理它为止。

  

一、UML结构图

二、代码示例

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace 责任链模式
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             Handle hA=new ConcreteHandleA();
13             Handle hB = new ConcreteHandleB();
14             Handle hC = new ConcreteHandleC();
15 
16             hA.SetNextHandle(hB);
17             hB.SetNextHandle(hC);
18 
19             hA.HandleRequest();
20 
21             Console.Read();
22         }
23     }
24 
25     /// <summary>
26     /// 请求处理类
27     /// </summary>
28     public abstract class Handle
29     {
30         protected Handle m_NextHandle;
31         public void SetNextHandle(Handle handle)
32         {
33             m_NextHandle = handle;
34         }
35 
36         public abstract void HandleRequest();
37     }
38 
39     public class ConcreteHandleA : Handle
40     {
41         public override void HandleRequest()
42         {
43             //判断自身能否处理
44             Console.WriteLine("ConcreteHandleA 正在处理自己那部分(请假申请,A审批)...");
45 
46             //交由下一个人员
47             if (m_NextHandle != null)
48                 m_NextHandle.HandleRequest();
49         }
50     }
51 
52     public class ConcreteHandleB : Handle
53     {
54         public override void HandleRequest()
55         {
56             //判断自身能否处理
57             Console.WriteLine("ConcreteHandleB 正在处理自己那部分(请假申请,B审批)...");
58 
59             //交由下一个人员
60             if (m_NextHandle != null)
61                 m_NextHandle.HandleRequest();
62         }
63     }
64 
65     public class ConcreteHandleC : Handle
66     {
67         public override void HandleRequest()
68         {
69             //判断自身能否处理
70             Console.WriteLine("ConcreteHandleC 正在处理自己那部分(请假申请,C审批)...");
71 
72             //交由下一个人员
73             if (m_NextHandle != null)
74                 m_NextHandle.HandleRequest();
75         }
76     }
77 
78 }
代码示例

三、作用

1、请求者和接受者解耦合

2、增加或修改请求的处理结构变得容易,增加了指派责任的灵活性。

需要注意的是:防止一个请求,到结尾也都没有能够处理的对象。

原文地址:https://www.cnblogs.com/qiupiaohujie/p/11976230.html