大話設計模式-職責鏈模式
阿新 • • 發佈:2018-12-05
它的 活性 sso style 否則 write 地方 protected 後繼
職責鏈模式
使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。
將這個對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
職責鏈模式的好處
當客戶提交一個請求時,請求時艷鏈傳遞直至有一個具體處理者負責處理他。
接收者和發送者都沒有地方的明確信息,且鏈中對象自己也不知道鏈的結構。
結果是職責鏈可簡化對象的相互連接,他們僅需保持一個指向其後繼者的引用,而不需保持他所有的候選者的引用。
隨時地增加或修改處理一個請求的結構,增強了給對象指派職責的靈活性。
不過一個請求極有可能到了鏈的末端都得不到處理,或者因為沒有正確配置而得不到處理。
職責鏈模式結構演示
抽象請求
定義一個處理請求的接口。
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
大話設計模式-職責鏈模式