什麼是職責鏈模式? China of Responsibility:使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關系。將這個對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。 像這種情況在我們身邊隨處可見,比如,班裡想申請一個教室舉辦元旦晚會,文藝委員不能自作主張使用某個教室,於是找到班長,班長要做的就是寫申請,向負責人員申請,負責人批准以後才能使用教室,這一步步的過程就像是一條鏈,從某一點開始執行,不能通過的話就向後走,知道找到某一點能解決了問題才終止。問題只要解決了就達到了目的,不用考慮中間有多少人參與過,也就是只關心結果 此班學生的動機可以表示成如圖: 職責鏈模式結構圖: 角色: Client:客戶端 Handler: 抽象處理者:定義出一個處理請求的接口。如果需要,接口可以定義出一個方法以設定和返回對下家的引用。這個角色通常由一個抽象類或接口實現www.2cto.com ConcreteHandler:具體處理者:具體處理者接到請求後,可以選擇將請求處理掉,或者將請求傳給下家。由於具體處理者持有對下家的引用,因此,如果需要具體處理者可以訪問下家 代碼實現: [html] <span style="font-family:KaiTi_GB2312;font-size:18px;">using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 職責鏈模式 { 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, 14, 22, 18, 3, 27, 20 }; foreach (int request in requests) { //循環給最小處理著提交請求,不同的數據由不同權限處理者處理 h1.HandleRequest(request); } Console.Read(); } } //Handler類,定義一個處理請示的接口 abstract class Handler { protected Handler successor; //設置繼任者 public void SetSuccessor(Handler successor) { this.successor = successor; } //處理請求的抽象方法 public abstract void HandleRequest(int request); } //ConcreteHandler類,具體處理者類,處理它所負責的請求,可訪問它的後繼者,如果可處理該請求就處理它,否則就將該請求轉發給它的後繼者 //ConcreteHandler1類,當請求數在0到10之間則有權處理,否則轉到下一位 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); } } } //ConcreteHandler2類,當請求數在10到20之間則有權處理,否則轉到下一位 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); } } } //ConcreteHandler3類,當請求數在20到30之間則有權處理,否則轉到下一位 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); } } } } </span> 運行結果: