iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
Software Development

深入淺出設計模式 - 使用 C++系列 第 22

[Day 22] 為請求創建一條處理鍊 - 責任鍊設計模式 (Chain of Responsibility Pattern)

  • 分享至 

  • xImage
  •  

Intent

  • Chain of Responsibility is a behavioral design pattern that lets you pass requests along a chain of handlers
    • Upon receiving a request, each handler decides either to process the request or to pass it to the next handler in the chain
      https://ithelp.ithome.com.tw/upload/images/20231005/20138643MnyTypm0zv.png

特色

優點

解耦: 發送者和接收者之間沒有硬連接
靈活性: 可以根據業務需求靈活地添加或刪除處理單元
高可擴展性: 高度模組化,易於維護和擴展,新的處理邏輯可以輕易地被添加到系統中

缺點

效能: 可能降低,特別是在長鏈中
請求失效: 中間任一 Handler 發生錯誤,都有可能導致整條鍊的操作失效 (Some requests may end up unhandled)
Debug較不易: 筆者的主觀經驗...,需要很細心的一層層卡斷點來執行,遇到有時效限制,會 Timeout 的場景就會看得很累...

組成

Handler: 定義了一個接口,用於處理請求
ConcreteHandler: 實現Handler接口,並進行實際的請求處理
Client: 發送請求
https://ithelp.ithome.com.tw/upload/images/20231005/20138643i2rcfyfYxO.png

應用場景

註: 筆者以前曾在銀行做過軟體工程師,其實金融類應用特別適合使用責任鍊模式哦!

  • 交易審核: 不同級別的審核,例如分行經理、區域經理、總部
  • 貸款批准: 根據貸款金額和客戶信用評級,由不同級別的管理人員進行批准
  • 風險評估: 在金融交易或投資中,風險評估是一個多層次的過程。例:
    • 初級風險評估: 基於交易金額和頻率進行
    • 中級風險評估: 加入市場條件和交易對象的評估
    • 高級風險評估: 包括宏觀經濟因素和法律因素...等

範例: 貸款審核

// Handler
class LoanApprover {
public:
    LoanApprover* nextApprover;
    virtual void setNext(LoanApprover* next) {
        nextApprover = next;
    }
    virtual void approveLoan(int amount) = 0;
};

// ConcreteHandler1: BranchManager
class BranchManager : public LoanApprover {
public:
    void approveLoan(int amount) {
        if (amount <= 50000) {
            cout << "Loan approved by Branch Manager" << endl;
        } else if (nextApprover != nullptr) {
            nextApprover->approveLoan(amount);
        }
    }
};

// ConcreteHandler2: RegionalManager
class RegionalManager : public LoanApprover {
public:
    void approveLoan(int amount) {
        if (amount <= 100000) {
            cout << "Loan approved by Regional Manager" << endl;
        } else if (nextApprover != nullptr) {
            nextApprover->approveLoan(amount);
        }
    }
};

// Client
int main() {
    LoanApprover* branchManager = new BranchManager();
    LoanApprover* regionalManager = new RegionalManager();
  
    // 分行經理批准完貸款,下一位換給區經理過目
    branchManager->setNext(regionalManager);
    
    int loanAmount = 60000;
    // 第一關開始啟動,接下來會一連串的 Handler 處理後續求
    branchManager->approveLoan(loanAmount);
}

Reference

  1. https://refactoring.guru/design-patterns/chain-of-responsibility
  2. https://reactiveprogramming.io/blog/en/design-patterns/chain-of-responsability

上一篇
[Day 21] 拆解複雜物件的建立 - 生成器模式 (Builder Pattern)
下一篇
[Day 23] 集中管理大量物件實例 - 蠅量模式 (Flyweight Pattern)
系列文
深入淺出設計模式 - 使用 C++37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言