责任链模式(Chain_Of_Responsibility)
职责链模式(Chain Of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
类似于异常处理机制中定义的那样,代码抛出一个异常,在异常处理链当中,会有一个对象来处理该异常。
职责链模式结构图

责任链模式代码结构

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); Handler h3 = new ConcreteHandler3(); h1.SetSuccessor(h2); h2.SetSuccessor(h3); int[] requests = { 2,3,5,6,32,57,5,21 }; foreach(int request in requests) { h1.HandleRequest(request); }
abstract class Handler { protected Handler successor; public void SetSuccessor(Handler successor) { this.successor = successor; } public abstract void HandleRequest(int request); }
class ConcreteHandler1 : Handler { public override void HandleRequest(int request) { if (request >= 0 && request < 10) { Console.WriteLine("处理请求", this.GetType().Name, request); } else if(successor!=null){ successor.HandleRequest(request); } } }
class ConcreteHandler2 : Handler { public override void HandleRequest(int request) { if (request >= 10 && request < 20) { Console.WriteLine("处理请求", this.GetType().Name, request); } else if (successor != null) { successor.HandleRequest(request); } } }
class ConcreteHandler3 : Handler { public override void HandleRequest(int request) { if (request >= 20 && request < 30) { Console.WriteLine("处理请求", this.GetType().Name, request); } else if (successor != null) { successor.HandleRequest(request); } } }
|
责任链模式总结
- 类有太多的责任,这违背了单一职责原则,增加新的管理类,又违背了开放-封闭原则。
- 将各种管理者类别分离开来,均作为管理者的子类,利用多态来化解分支判断的僵化。
- 用一些“关联”来将管理类中的责任传递,用于把用户的请求传递,直到遇到可以解决这个请求的管理类为止。
责任链的好处
当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。
接收者和发送者都没有对方的明确信息,且链中对象自己也并不知道链的结构。结果是责任链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选者的引用。大大降低了耦合度。
随时地增加或处理一个请求的结构。增强了给对象指派职责的灵活性。
潜在的问题
一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。