後端開發 設計模式 · 第 14 / 24 篇

責任鏈模式:層層把關的處理機制

責任鏈模式 (Chain of Responsibility) 將請求沿著處理鏈傳遞,直到被處理為止。本文以 C# 公文簽核範例,教你打造彈性的處理機制。

哈囉~又來到了我們設計模式系列啦,今天要介紹的是一個非常靈活又好用的模式:責任鏈模式(Chain of Responsibility)。

🌟 責任鏈模式是什麼?

責任鏈模式是一種將請求逐一傳遞,直到找到合適的處理者來處理的設計模式。就像公司報銷流程,先交給直屬主管簽核,如果權限不足就往上一層,直到有權限的人批准為止。

透過這個模式,每個處理者只專注自己的職責,無法處理的部分就交給下一個處理者,既清楚又明確。


🤔 什麼情況適合使用責任鏈模式?

  • 多個物件都能處理同一個請求,但條件或處理範圍不同。
  • 責任層級可能會更動,希望降低請求者與處理者的耦合度。
  • 想讓系統更彈性,可依需求增減處理節點。

📝 C# 責任鏈模式範例

以下以「公司費用審核」為例,示範責任鏈模式的實作。

💼 建立抽象處理者(Handler)

using System;

/// <summary>
/// 抽象處理者
/// </summary>
public abstract class Approver
{
    /// <summary>
    /// 下一位處理者
    /// </summary>
    protected Approver _nextApprover;

    /// <summary>
    /// 設定下一位處理者
    /// </summary>
    public void SetNext(Approver approver)
    {
        _nextApprover = approver;
    }

    /// <summary>
    /// 處理請求
    /// </summary>
    /// <param name="amount">請求金額</param>
    public abstract void HandleRequest(decimal amount);
}

👩‍💻 建立具體處理者(主管、經理、總經理)

using System;

/// <summary>
/// 主管
/// </summary>
public class Supervisor : Approver
{
    public override void HandleRequest(decimal amount)
    {
        if (amount <= 1000)
        {
            Console.WriteLine($"主管批准了金額 {amount} 的請求。");
        }
        else if (_nextApprover != null)
        {
            _nextApprover.HandleRequest(amount);
        }
    }
}

/// <summary>
/// 經理
/// </summary>
public class Manager : Approver
{
    public override void HandleRequest(decimal amount)
    {
        if (amount <= 5000)
        {
            Console.WriteLine($"經理批准了金額 {amount} 的請求。");
        }
        else if (_nextApprover != null)
        {
            _nextApprover.HandleRequest(amount);
        }
    }
}

/// <summary>
/// 總經理
/// </summary>
public class GeneralManager : Approver
{
    public override void HandleRequest(decimal amount)
    {
        Console.WriteLine($"總經理批准了金額 {amount} 的請求。");
    }
}

🚀 實際使用範例

using System;

class Program
{
    static void Main(string[] args)
    {
        Approver supervisor = new Supervisor();
        Approver manager = new Manager();
        Approver generalManager = new GeneralManager();

        supervisor.SetNext(manager);
        manager.SetNext(generalManager);

        supervisor.HandleRequest(500);
        supervisor.HandleRequest(3000);
        supervisor.HandleRequest(8000);
    }
}

🎯 執行結果

主管批准了金額 500 的請求。
經理批准了金額 3000 的請求。
總經理批准了金額 8000 的請求。

⚠️ 責任鏈模式使用注意事項

  • 優點:降低請求者與處理者之間的耦合度,方便擴充與維護。
  • 缺點:若責任鏈過長,可能導致效能降低且不易除錯。

🎉 結語

恭喜你又學會了責任鏈模式(Chain of Responsibility)!透過這個模式,你可以讓程式更彈性,輕鬆處理複雜請求。下篇再見囉~

系列:

讀完了!你覺得這篇如何?

你的回饋會決定下一篇要寫什麼。

還有疑問

Learning path

設計模式

這篇是系列中的第 14 / 24 篇。可以順著列表補完整脈絡,也可以直接跳到需要的段落。

  1. 01 搞懂設計模式到底是什麼?
  2. 02 單例模式:只要一個就夠!
  3. 03 工廠方法模式:點披薩不用親自下廚
  4. 04 抽象工廠模式:系列產品輕鬆生產
  5. 05 原型模式:複製的藝術
  6. 06 建造者模式:一步步完成複雜任務
  7. 07 介面卡模式:讓不相容也能合作
  8. 08 橋接模式:抽象與實作分離
  9. 09 組合模式:樹狀結構的好幫手
  10. 10 裝飾者模式:讓功能自由加點
  11. 11 外觀模式:化繁為簡
  12. 12 享元模式:節省記憶體的利器
  13. 13 代理模式:控制存取的守門員
  14. 14 責任鏈模式:層層把關的處理機制 目前閱讀
  15. 15 命令模式:靈活封裝的請求指令
  16. 16 解譯器模式:讓程式聽懂你的指令
  17. 17 迭代器模式:輕鬆遍歷集合元素
  18. 18 中介者模式:管理複雜溝通的好幫手
  19. 19 備忘錄模式:保存與恢復物件狀態
  20. 20 觀察者模式:即時通知的好幫手
  21. 21 狀態模式:依狀態改變行為的祕訣
  22. 22 策略模式:靈活切換行為的好幫手
  23. 23 模板方法模式:固定流程靈活實作
  24. 24 訪問者模式:新增功能不動既有架構

Further reading

中介者模式:管理複雜溝通的好幫手 封面圖 2025-06-13 中介者模式:管理複雜溝通的好幫手 備忘錄模式:保存與恢復物件狀態 封面圖 2025-06-13 備忘錄模式:保存與恢復物件狀態 模板方法模式:固定流程靈活實作 封面圖 2025-06-13 模板方法模式:固定流程靈活實作

留言討論

用 GitHub 帳號留言,留言會同步到這個 Blog 的 GitHub Discussions。

閱讀導覽

約 2 分鐘

本篇所在系列 · 第 14 / 24 篇

設計模式

  1. 搞懂設計模式到底是什麼?
  2. 單例模式:只要一個就夠!
  3. 工廠方法模式:點披薩不用親自下廚
  4. 抽象工廠模式:系列產品輕鬆生產
  5. 原型模式:複製的藝術
  6. 建造者模式:一步步完成複雜任務
  7. 介面卡模式:讓不相容也能合作
  8. 橋接模式:抽象與實作分離
  9. 組合模式:樹狀結構的好幫手
  10. 裝飾者模式:讓功能自由加點
  11. 外觀模式:化繁為簡
  12. 享元模式:節省記憶體的利器
  13. 代理模式:控制存取的守門員
  14. 責任鏈模式:層層把關的處理機制
  15. 命令模式:靈活封裝的請求指令
  16. 解譯器模式:讓程式聽懂你的指令
  17. 迭代器模式:輕鬆遍歷集合元素
  18. 中介者模式:管理複雜溝通的好幫手
  19. 備忘錄模式:保存與恢復物件狀態
  20. 觀察者模式:即時通知的好幫手
  21. 狀態模式:依狀態改變行為的祕訣
  22. 策略模式:靈活切換行為的好幫手
  23. 模板方法模式:固定流程靈活實作
  24. 訪問者模式:新增功能不動既有架構
看完整系列 24 篇