首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ NVI 模式:非虛擬介面設計模式深度解析

     編輯:程式設計綜合問答

Thrift 原始碼中見到 read() 呼叫 read_virt(),而非直接虛擬 read(),這是經典的 NVI (Non-Virtual Interface) 模式。

核心結構

class Base {
public:
    // 公開非虛擬介面:封裝不變的前置/後置邏輯
    void read() {
        preRead();          // 1. 前置檢查、日誌、鎖定
        read_virt();        // 2. 委派給虛擬函數實作多型
        postRead();         // 3. 後置清理、解鎖、通知
    }
private:
    virtual void read_virt() = 0; // 純虛擬,子類實作核心邏輯
    void preRead() { /* 共用邏輯 */ }
    void postRead() { /* 共用邏輯 */ }
};

優點

  • 封裝不變部份:前置/後置邏輯集中在基類,子類無法竄改流程。
  • 強制介面契約:公開介面不可覆寫,保證行為一致性。
  • 易於除錯/擴充:在基類加日誌、效能計時、例外處理,所有子類自動受益。
  • 支援模板方法模式:preRead/postRead 可再虛擬化,允許子類微調。

適用場景

  • 框架設計:定義演算法骨架,延遲關鍵步驟到子類。
  • API 邊界:公開穩定介面,內部實作可變。
  • 資源管理:RAII 風格的鎖定/釋放、連線建立/關閉。

參考:NVI 模式詳細解析

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved