模式特点
为其他对象提供一种代理以控制对这个对象的访问。代理模式在客户端和目标对象之间增加一层中间层,可以在访问前后添加额外逻辑。
- 远程代理:为远程对象提供本地代表
- 虚拟代理:延迟创建开销大的对象(懒加载)
- 保护代理:控制访问权限
- 智能引用代理:访问时附加额外操作(计数、日志)
类图
应用场景
- Qt 中 QSqlDatabase 代理数据库连接,管理连接池
- 智能指针(std::shared_ptr)就是代理模式的体现
- RPC 框架中的 Stub:本地代理远程服务调用
- 图片懒加载:先显示占位图,需要时才加载大图
- 权限控制:在访问业务方法前检查用户权限
示例代码(C++)
// 抽象主题 class Image { public: virtual void display() = 0; virtual ~Image() = default; }; // 真实主题 - 加载大图开销大 class RealImage : public Image { std::string m_filename; public: RealImage(const std::string& fn) : m_filename(fn) { std::cout << "加载图片: " << m_filename << " (耗时操作)" << std::endl; } void display() override { std::cout << "显示图片: " << m_filename << std::endl; } }; // 虚拟代理 - 延迟加载 class ImageProxy : public Image { RealImage* m_realImage = nullptr; std::string m_filename; public: ImageProxy(const std::string& fn) : m_filename(fn) {} void display() override { if (!m_realImage) // 懒加载:首次访问才创建 m_realImage = new RealImage(m_filename); m_realImage->display(); } }; // 使用:创建代理不加载图片,显示时才加载 Image* img = new ImageProxy("big_photo.jpg"); std::cout << "代理创建完成,图片未加载" << std::endl; img->display(); // 此时才真正加载