設計模式——職責鏈模式
阿新 • • 發佈:2018-12-12
使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞請求,直到有一個物件處理他為止。
namespace 職責鏈模式 { 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("{0}處理請求{1}", 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("{0}處理請求{1}", 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("{0}處理請求{1}", this.GetType().Name, request); } else if (successor != null) { successor.HandleRequest(request); } } } class Program { static void Main(string[] args) { Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); Handler h3 = new ConcreteHandler3(); h1.SetSuccessor(h2); h2.SetSuccessor(h3); int[] requests = { 2, 5, 8, 11, 14, 24, 44 }; foreach (int request in requests) { h1.HandleRequest(request); } Console.Read(); } } }
優點:
當客戶提交一個請求的時候,請求是沿鏈傳遞直至有一個ConcreteHandler物件負責處理它。
使得接收者和傳送者都沒有對方的明確資訊,且鏈中的物件自己也並不知道鏈的結構。結果是職責鏈可簡化為物件的相互連線,它們僅需保持一個指向其後繼者的引用,而不需要保持它的所有候選者接受者的引用。
可以隨時增加或者修改處理一個請求的結構。增強了給物件指派職責的靈活性。
但是,一個請求極有可能到了鏈的末端都得不到處理,這種情況需要考慮全域性。