← 返回博客列表

模式特点

为其他对象提供一种代理以控制对这个对象的访问。代理模式在客户端和目标对象之间增加一层中间层,可以在访问前后添加额外逻辑。

类图

类图

应用场景

示例代码(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();  // 此时才真正加载