职责链模式(Chain Of Responsibility)
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
将这个对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
结构图:

实现代码:
1 namespace ChainOfResponsibilityPattern 2 { 3 //2017.06.24 15:44 by ldb 4 //Handler类,定义一个处理请示的接口。 5 abstract class Handler 6 { 7 protected Handler successor; 8 public void SetSuccessor(Handler successor)//设置继承者。 9 { 10 this.successor = successor; 11 } 12 13 public abstract void HandleRequest(int request);//处理请求的抽象方法。 14 } 15 /// <summary> 16 /// 具体处理类,该类只能处理0到10之间的的请求,否则转到下一位。 17 /// </summary> 18 class ConcreteHandler1 : Handler 19 { 20 public override void HandleRequest(int request) 21 { 22 if (request >= 0 && request <= 10) 23 { 24 Console.WriteLine("{0} 处理请求{1}",this.GetType().Name,request); 25 } 26 else if (successor != null) 27 { 28 successor.HandleRequest(request);//转给下一位。 29 } 30 } 31 } 32 /// <summary> 33 /// 具体处理类,该类只能处理11到20之间的的请求,否则转到下一位。 34 /// </summary> 35 class ConcreteHandler2 : Handler 36 { 37 public override void HandleRequest(int request) 38 { 39 if (request >= 11 && request <= 20) 40 { 41 Console.WriteLine("{0} 处理请求{1}", this.GetType().Name, request); 42 } 43 else if (successor != null) 44 { 45 successor.HandleRequest(request);//转给下一位。 46 } 47 } 48 } 49 50 /// <summary> 51 /// 具体处理类,该类只能处理21到30之间的的请求,否则转到下一位。 52 /// </summary> 53 class ConcreteHandler3 : Handler 54 { 55 public override void HandleRequest(int request) 56 { 57 if (request >= 21 && request <= 30) 58 { 59 Console.WriteLine("{0} 处理请求{1}", this.GetType().Name, request); 60 } 61 else if (successor != null) 62 { 63 successor.HandleRequest(request);//转给下一位。 64 } 65 } 66 } 67 class Program 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 = new int[] {2,5,14,22,18,3,27,20 }; 79 foreach (var request in requests)//循环给最小处理者提交请求,不同的数额,由不同权限者处理。 80 { 81 h1.HandleRequest(request); 82 } 83 84 Console.ReadKey(); 85 } 86 } 87 }
结果:


浙公网安备 33010602011771号