代理模式在 C++ 中不是靠语言特性强制实现的,而是通过类设计达成的——核心是让代理类持有真实对象的引用或指针,并在转发调用前后插入控制逻辑。
代理类必须继承同一接口(或使用模板约束)
否则无法实现“对客户端透明”的替换。最常见做法是定义抽象基类 IFileReader,让 RealFileReader 和 LoggingFileReader 都继承它:
class IFileReader {
public:
virtual ~IFileReader() = default;
virtual std::string read(const std::string& path) = 0;
};
代理类不直接暴露真实对象类型,客户端只依赖 IFileReader 接口。若用模板实现静态代理(如 Proxy),则需确保 T 具备一致的公有接口,且代理要重载所有需拦截的函数。
访问控制逻辑应放在代理的成员函数内部,而非构造时硬编码
比如权限检查不能只在构造函数里做一次,而应在每次 read() 调用前验证。典型错误是把用户 ID 存为代理类的 const 成员,导致后续请求无法动态鉴权:
立即学习“C++免费学习笔记(深入)”;