GoF——职责链模式
职责链模式(chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
结构图:
职责链的好处
关键:当客户提交一个请求时,请求是沿着链传递直至有一个ConcreteHandler对象处理它为止
使得接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构,结构式职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接收者者的引用。大大降低了耦合度。
必须要全面考虑,因为一个请求有可能到了链的末尾也得不到处理,或者因为没有正确配置而没有得到处理。
代码示例:
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace 职责链模式 6 { 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 Handler h1 = new ConcreteHandler1(); 12 Handler h2 = new ConcreteHandler2(); 13 Handler h3 = new ConcreteHandler3(); 14 h1.SetSuccessor(h2); 15 h2.SetSuccessor(h3); 16 17 int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 }; 18 19 foreach (int request in requests) 20 { 21 h1.HandleRequest(request); 22 } 23 24 Console.Read(); 25 26 } 27 } 28 29 abstract class Handler 30 { 31 protected Handler successor; 32 33 public void SetSuccessor(Handler successor) 34 { 35 this.successor = successor; 36 } 37 38 public abstract void HandleRequest(int request); 39 } 40 41 class ConcreteHandler1 : Handler 42 { 43 public override void HandleRequest(int request) 44 { 45 if (request >= 0 && request < 10) 46 { 47 Console.WriteLine("{0} 处理请求 {1}", 48 this.GetType().Name, request); 49 } 50 else if (successor != null) 51 { 52 successor.HandleRequest(request); 53 } 54 } 55 } 56 57 class ConcreteHandler2 : Handler 58 { 59 public override void HandleRequest(int request) 60 { 61 if (request >= 10 && request < 20) 62 { 63 Console.WriteLine("{0} 处理请求 {1}", 64 this.GetType().Name, request); 65 } 66 else if (successor != null) 67 { 68 successor.HandleRequest(request); 69 } 70 } 71 } 72 73 class ConcreteHandler3 : Handler 74 { 75 public override void HandleRequest(int request) 76 { 77 if (request >= 20 && request < 30) 78 { 79 Console.WriteLine("{0} 处理请求 {1}", 80 this.GetType().Name, request); 81 } 82 else if (successor != null) 83 { 84 successor.HandleRequest(request); 85 } 86 } 87 } 88 89 }
2016-04-08