文档目录

一、NVI 的核心思想

非虚接口(Non-Virtual Interface):基类的公有接口不是虚函数,而是调用私有的虚函数。

class DataProcessor {
public:
    // 公有接口——非虚
    void process() {
        // 统一的前置处理
        std::lock_guard<std::mutex> lock(mtx_);
        log_start();

        // 调用派生类实现的虚函数
        do_process();

        // 统一的后置处理
        log_end();
    }

    virtual ~DataProcessor() = default;

private:
    std::mutex mtx_;

    // 私有虚函数——派生类改写这个
    virtual void do_process() = 0;

    void log_start() { /* ... */ }
    void log_end()   { /* ... */ }
};

好处:基类在 process() 中统一添加了日志、锁、性能统计,派生类只需要关心 do_process() 的业务逻辑,不需要重复写这些横切关注点。