責任鏈模式

电器小君子發表於2024-09-09

責任鏈模式是一種行為設計模式,它允許多個物件處理請求,而無需指定處理請求的具體處理者。請求沿著鏈傳遞,直到有一個物件處理它為止。這種模式允許將請求的傳送者和接收者解耦,並使多個物件都有機會處理請求。

以下是一個簡單的責任鏈模式的示例程式碼:

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 用於處理請求。然後我們建立了兩個具體處理者類 ConcreteHandlerAConcreteHandlerB,它們分別實現了處理請求的具體邏輯。

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 不再呼叫後續的處理者,而是直接輸出結束訊息,表明請求無法被處理。當將超出所有處理者能力範圍的請求傳送到處理者鏈時,在這種情況下,處理者鏈能夠正確地終止並指示該請求無法被處理。

透過新增適當的終止條件,我們可以有效避免責任鏈模式中的死迴圈問題,保證系統的穩定性和正確性。

相關文章