大话设计模式-职责链模式
职责链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
职责链模式的好处
当客户提交一个请求时,请求时艳链传递直至有一个具体处理者负责处理他。
接收者和发送者都没有地方的明确信息,且链中对象自己也不知道链的结构。
结果是职责链可简化对象的相互连接,他们仅需保持一个指向其后继者的引用,而不需保持他所有的候选者的引用。
随时地增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。
不过一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。
职责链模式结构演示
抽象请求
定义一个处理请求的接口。
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($"{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($"{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($"{GetType().Name}处理请求{request}"); else if (successor != null) successor.HandleRequest(request); } }
测试结果
Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); Handler h3 = new ConcreteHandler3(); h1.SetSuccessor(h2); h2.SetSuccessor(h3); //处理请求 int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 }; foreach (var request in requests) h1.HandleRequest(request); //测试结果 ConcreteHandler1处理请求2 ConcreteHandler1处理请求5 ConcreteHandler2处理请求14 ConcreteHandler3处理请求22 ConcreteHandler2处理请求18 ConcreteHandler1处理请求3 ConcreteHandler3处理请求27 ConcreteHandler3处理请求20