目录
代理模式(Proxy Pattern)是一种【结构型】设计模式,它允许通过代理对象控制对另一个对象(目标对象)的访问。代理对象在客户端和目标对象之间充当中间层,负责处理与目标对象的交互,例如延迟加载、访问控制、缓存或日志记录等。
一、模式核心概念与结构
代理模式包含三个核心角色:
- 抽象主题(Subject):定义目标对象和代理对象的共同接口,客户端通过该接口与目标对象交互。
- 目标对象(Real Subject):实现抽象主题接口,提供实际的业务逻辑。
- 代理对象(Proxy):实现抽象主题接口,持有目标对象的引用,并在调用目标对象方法前后执行额外操作。
二、C++ 实现示例:图像加载代理
以下是一个经典的代理模式示例,演示如何使用代理模式实现图像的延迟加载:
#include <iostream>
#include <string>
#include <memory>
// 抽象主题:图像
class Image {
public:
virtual ~Image() = default;
virtual void display() const = 0;
};
// 目标对象:真实图像
class RealImage : public Image {
private:
std::string filename;
public:
RealImage(const std::string& fname) : filename(fname) {
loadFromDisk();
}
void display() const override {
std::cout << "Displaying image: " << filename << std::endl;
}
// 模拟从磁盘加载图像(耗时操作)
void loadFromDisk() const {
std::cout << "Loading image: " << filename << std::endl;
}
};
// 代理对象:图像代理
class ProxyImage : public Image {
private:
std::string filename;
mutable std::shared_ptr<RealImage> realImage; // 延迟加载
public:
ProxyImage(const std::string& fname) : filename(fname), realImage(nullptr) {
}
void display() const override {
if (!realImage) {
// 延迟加载:首次调用时才创建真实对象
realImage = std::make_shared<RealImage>(filename