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