代理模式的核心是代理对象持有真实对象引用并提供相同接口,将调用转发给真实对象,同时在前后插入额外逻辑;C++中通过抽象基类定义纯虚接口,由RealImage和ProxyImage共同继承,ProxyImage延迟加载RealImage以实现虚拟代理。

代理模式的核心是让代理对象持有真实对象的引用,对外提供相同接口,把调用转发给真实对象,同时在前后可插入额外逻辑(如权限检查、日志、延迟加载等)。C++中常用抽象基类定义接口,由真实类和代理类共同继承。
定义统一接口
先用纯虚函数声明操作契约,确保代理与真实对象行为一致:
class Image {
public:
virtual ~Image() = default;
virtual void display() const = 0;
};实现真实对象
真实类负责核心功能,比如加载并显示图片:
class RealImage : public Image {
private:
std::string filename;
public:
explicit RealImage(const std::string& f) : filename(f) {
std::cout << "Loading image: " << filename << "\n";
// 模拟耗时加载
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
void display() const override {
std::cout << "Displaying image: " << filename << "\n";
}};
立即学习“C++免费学习笔记(深入)”;
实现代理类
代理持有一个真实对象指针(延迟初始化或直接持有),重写接口方法,在调用前后加入控制逻辑:
Modoer 是一款以本地分享,多功能的点评网站管理系统。采用 PHP+MYSQL 开发设计,开放全部源代码。因具有非凡的访问速度和卓越的负载能力而深受国内外朋友的喜爱,不局限于商铺类点评,真正实现了多类型的点评,可以让您的网站点评任何事与物,同时增加产品模块,也更好的网站产品在网站上展示。Modoer点评系统 2.5 Build 20110710更新列表1.同步 旗舰版系统框架2.增加 限制图片
class ProxyImage : public Image {
private:
std::string filename;
mutable RealImage* real_image; // mutable 允许在 const 成员函数中修改
public:
explicit ProxyImage(const std::string& f) : filename(f), real_image(nullptr) {}
~ProxyImage() {
delete real_image;
}
void display() const override {
if (!real_image) {
real_image = new RealImage(filename);
}
real_image->display();
}};
立即学习“C++免费学习笔记(深入)”;
使用方式
客户端只依赖 Image 接口,无需感知是代理还是真实对象:
int main() {
Image* image1 = new ProxyImage("photo.jpg");
Image* image2 = new ProxyImage("report.pdf");
image1->display(); // 触发加载 + 显示
image1->display(); // 直接显示(已加载)
image2->display(); // 触发加载 + 显示
delete image1;
delete image2;
return 0;
}
这个例子展示的是“虚拟代理”(lazy initialization),其他常见变体如保护代理(加访问控制)、远程代理(封装网络调用)、智能引用代理(自动计数/释放)等,都遵循同一结构:接口统一、代理持有真实对象、转发+增强。









