責任鏈模式是一種行為設計模式,它允許多個物件處理請求,而無需指定處理請求的具體處理者。請求沿著鏈傳遞,直到有一個物件處理它為止。這種模式允許將請求的傳送者和接收者解耦,並使多個物件都有機會處理請求。
以下是一個簡單的責任鏈模式的示例程式碼:
using System; // 抽象處理者 abstract class Handler { protected Handler successor; public void SetSuccessor(Handler successor) { this.successor = successor; } public abstract void HandleRequest(int request); } // 具體處理者A class ConcreteHandlerA : Handler { public override void HandleRequest(int request) { if (request < 10) { Console.WriteLine("Request " + request + " handled by ConcreteHandlerA"); } else if (successor != null) { successor.HandleRequest(request); } } } // 具體處理者B class ConcreteHandlerB : Handler { public override void HandleRequest(int request) { if (request >= 10 && request < 20) { Console.WriteLine("Request " + request + " handled by ConcreteHandlerB"); } else if (successor != null) { successor.HandleRequest(request); } } } class Program { static void Main() { // 建立具體處理者A和B Handler handlerA = new ConcreteHandlerA(); Handler handlerB = new ConcreteHandlerB(); // 建立處理者鏈 handlerA.SetSuccessor(handlerB); // 傳送請求並在鏈上處理 handlerA.HandleRequest(5); handlerA.HandleRequest(12); handlerA.HandleRequest(25); } }
在上面的程式碼中,我們定義了一個抽象處理者 Handler
類,其中包含一個指向下一個處理者的引用 successor
,並且有一個抽象方法 HandleRequest
用於處理請求。然後我們建立了兩個具體處理者類 ConcreteHandlerA
和 ConcreteHandlerB
,它們分別實現了處理請求的具體邏輯。
在 Main()
方法中,我們首先建立了具體處理者A和B,並將它們建立成了處理者鏈,即 A 處理不了的請求會傳遞給 B 處理。然後我們傳送了幾個請求,並透過責任鏈模式來處理這些請求。
責任鏈模式可以根據具體場景動態地組織處理者之間的關係,在系統中靈活地處理請求,且降低了傳送者和接收者之間的耦合度。
擴充套件:避免死迴圈問題需要在末端加上終止條件
// 具體處理者C class ConcreteHandlerC : Handler { public override void HandleRequest(int request) { if (successor != null) { successor.HandleRequest(request); } else { Console.WriteLine("End of the chain - Request " + request + " cannot be handled"); } } } class Program { static void Main() { // 建立具體處理者A、B和C Handler handlerA = new ConcreteHandlerA(); Handler handlerB = new ConcreteHandlerB(); Handler handlerC = new ConcreteHandlerC(); // 建立處理者鏈 handlerA.SetSuccessor(handlerB); handlerB.SetSuccessor(handlerC); // 傳送請求並在鏈上處理 handlerA.HandleRequest(5); // Request 5 handled by ConcreteHandlerA handlerA.HandleRequest(12); // Request 12 handled by ConcreteHandlerB handlerA.HandleRequest(25); // End of the chain - Request 25 cannot be handled } }
在這個修改後的示例程式碼中,我們新增了一個新的具體處理者 ConcreteHandlerC
,它並不實際處理請求,只是列印出一個結束訊息。在處理者鏈的末端,我們讓最後一個處理者 handlerC
不再呼叫後續的處理者,而是直接輸出結束訊息,表明請求無法被處理。當將超出所有處理者能力範圍的請求傳送到處理者鏈時,在這種情況下,處理者鏈能夠正確地終止並指示該請求無法被處理。
透過新增適當的終止條件,我們可以有效避免責任鏈模式中的死迴圈問題,保證系統的穩定性和正確性。