责任链模式(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、增加或修改请求的处理结构变得容易,增加了指派责任的灵活性。
需要注意的是:防止一个请求,到结尾也都没有能够处理的对象。
