C# 設計模式(行為型模式):責任鏈模式
責任鏈模式(Chain of Responsibility Pattern)是一種行為型設計模式,用于讓多個對象有機會處理同一個請求,避免請求發送者與接收者之間的耦合。它通過將請求沿著一條鏈傳遞,直到某個對象處理它,從而實現了請求和處理者的動態解耦。
一、責任鏈模式的核心概念
- 請求傳遞:將請求從一個對象傳遞到下一個對象,直到找到能夠處理請求的對象為止。
- 職責分離:每個對象專注于處理自己的職責,其他職責交由鏈上的其他對象處理。
- 動態鏈條:鏈條的結構可以動態調整,靈活擴展。
二、模式結構
在責任鏈模式中,通常包含以下角色:
-
Handler(抽象處理者)
定義一個接口,聲明處理請求的方法,以及一個引用指向下一個處理者。 -
ConcreteHandler(具體處理者)
實現抽象處理者接口,負責處理具體的請求。如果不能處理,則將請求傳遞給下一個處理者。 -
Client(客戶端)
創建并配置責任鏈,并向鏈的起點發出請求。
三、適用場景
- 職責分散:需要將職責分散到多個對象中,以便降低耦合度。
- 動態處理:某些請求需要靈活地由不同的對象處理。
- 多級審批:如審批系統、權限管理等需要逐級處理的場景。
四、C# 實現案例
1. 場景描述
假設一個公司有以下審批流程:
- 如果報銷金額小于 1000 元,由經理審批。
- 如果金額在 1000 元到 5000 元之間,由總監審批。
- 如果金額超過 5000 元,由副總裁審批。
2. 實現代碼
using System;namespace ChainOfResponsibilityExample
{// 抽象處理者abstract class Approver{protected Approver NextApprover;public void SetNext(Approver nextApprover){NextApprover = nextApprover;}public abstract void HandleRequest(PurchaseRequest request);}// 具體處理者:經理class Manager : Approver{public override void HandleRequest(PurchaseRequest request){if (request.Amount < 1000){Console.WriteLine($"經理批準了金額為 {request.Amount} 元的請求。");}else if (NextApprover != null){NextApprover.HandleRequest(request);}}}// 具體處理者:總監class Director : Approver{public override void HandleRequest(PurchaseRequest request){if (request.Amount >= 1000 && request.Amount <= 5000){Console.WriteLine($"總監批準了金額為 {request.Amount} 元的請求。");}else if (NextApprover != null){NextApprover.HandleRequest(request);}}}// 具體處理者:副總裁class VicePresident : Approver{public override void HandleRequest(PurchaseRequest request){if (request.Amount > 5000){Console.WriteLine($"副總裁批準了金額為 {request.Amount} 元的請求。");}else if (NextApprover != null){NextApprover.HandleRequest(request);}}}// 請求類class PurchaseRequest{public double Amount { get; }public PurchaseRequest(double amount){Amount = amount;}}// 客戶端class Program{static void Main(string[] args){// 構建責任鏈Approver manager = new Manager();Approver director = new Director();Approver vicePresident = new VicePresident();manager.SetNext(director);director.SetNext(vicePresident);// 模擬請求var request1 = new PurchaseRequest(500);var request2 = new PurchaseRequest(3000);var request3 = new PurchaseRequest(10000);manager.HandleRequest(request1);manager.HandleRequest(request2);manager.HandleRequest(request3);}}
}
五、運行結果
執行上述代碼后,輸出如下:
經理批準了金額為 500 元的請求。
總監批準了金額為 3000 元的請求。
副總裁批準了金額為 10000 元的請求。
六、優缺點分析
優點:
- 解耦請求與處理者:發送者無需知道具體的處理者是誰,減少了系統耦合。
- 職責分離:每個處理者只需專注于自己的職責,代碼清晰易維護。
- 易于擴展:可以輕松添加新的處理者,調整鏈條結構。
缺點:
- 可能無處理者響應:如果鏈的末端沒有處理請求的邏輯,可能導致請求丟失。
- 性能開銷:請求需要沿著鏈傳遞,鏈條過長可能影響性能。
七、實際應用場景
- 審批流程:多級審批系統中,每個級別的管理者負責不同金額范圍的審批。
- 日志處理:不同級別的日志可以由不同的處理器記錄(如控制臺、文件或遠程服務器)。
- 權限驗證:多級權限驗證鏈,根據用戶角色處理請求。
八、總結
責任鏈模式是一種優雅的設計模式,適用于需要動態分配職責的場景。通過它,可以實現請求發送者與處理者的解耦,使系統具有更好的擴展性和靈活性。如果你正在設計一個多級處理的系統,不妨試試責任鏈模式!
希望這篇文章能幫助你更好地理解責任鏈模式!如果有疑問或建議,歡迎在評論區留言 😊