【設計模式】——職責鏈模式(Chain Responsibility)
阿新 • • 發佈:2019-01-26
行為型模式——職責鏈模式(Chain Responsibility)定義:
使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,知道有一個物件處理它位置。
職責鏈模式結構圖
部分程式碼理解
Handler類,定義一個處理請示的介面
//定義一個處理請示的介面 abstract class Handler { protected Handler successor; public void SetSuccessor(Handler successor)//設定繼任者 { this.successor = successor; } public abstract void HandleRequest(int request);//處理請求的抽象方法 }
ConcreteHandler類,具體處理者類,處理它所負責的請求,可訪問它的後繼者,如果可處理該請求,就處理,否則就將該請求轉發給它的後繼者。
//請求數0-10之間有權處理,否則轉給下一位 class ConcreteHandler1:Handler { public override void HandleRequest (int request)//void函式返回值 { if (request >=0&& request<10) { 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 ConcreteHander2(); Handler h3 = new ConcreteHandler3(); h1.SetSuccessor(h2);//設定職責鏈的上下 h2.SetSuccessor(h3);//設定職責鏈的上下 int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 }; //迴圈給最小處理者提交請求,不同的數額,由不同的許可權處理者位置。 foreach (int request in requests) { h1.HandleRequest(request); } Console.Read(); } }
職責鏈的好處
1.當需求中提出一個請求時,請求是沿鏈傳遞直至有一個具體處理者類(ConcreteHandler類)負責處理它。
2.降低了耦合度,接收者和傳送者都沒有對方的明確訊息,且鏈中的物件自己也不知道鏈的結構,結果是職責鏈可以簡化物件的相互連結,它們僅需保持一個指向其後繼者的引用,而不需要保持它所有的候選者的引用。
3.可以隨時隨地增加或修改處理一個請求的結構,增強了給物件指派職責的靈活性。
注意:處理者類的許可權問題。