一、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() 的业务逻辑,不需要重复写这些横切关注点。