代理模式(Proxy Pattern)是一种结构型设计模式,它允许通过代理对象控制对另一个对象的访问。代理对象充当客户端和实际对象之间的中介,客户端通过代理对象间接访问实际对象,从而可以在访问控制、缓存、延迟加载等方面提供额外的功能。
在代理模式中,通常会有三种角色:
-
Subject(抽象主题):声明了真实对象和代理对象的共同接口,这样在任何使用真实对象的地方都可以使用代理对象。
-
RealSubject(真实主题):定义了代理对象所代表的真实对象,是最终需要访问的对象。
-
Proxy(代理):保存一个指向真实主题的引用,并提供与真实主题相同的接口,同时可以在调用真实主题之前或之后执行额外的操作。
#include <iostream>// Subject(抽象主题)
class Image {
public:virtual void display() = 0;
};// RealSubject(真实主题)
class RealImage : public Image {
private:std::string filename;public:RealImage(const std::string& filename) : filename(filename) {}void display() override {std::cout << "Displaying " << filename << std::endl;}
};// Proxy(代理)
class ImageProxy : public Image {
private:RealImage* realImage;std::string filename;public:ImageProxy(const std::string& filename) : filename(filename), realImage(nullptr) {}void display() override {if (!realImage) {realImage = new RealImage(filename);}realImage->display();}
};int main(int argc, char *argv[])
{// 使用代理对象显示图片Image* image = new ImageProxy("example.jpg");image->display();delete image;return 0;
}/*
在这个示例中,Image 是抽象主题,RealImage 是真实主题,ImageProxy 是代理。代理对象 ImageProxy 在调用 display() 方法时会首先判断是否已经创建了真实对象 RealImage,如果没有,则创建并显示;如果已经存在,则直接显示真实对象的内容。这样可以实现延迟加载真实对象的功能。通过代理模式,我们可以在不改变原有类结构的情况下,增强对真实对象的控制,实现额外的功能,如访问控制、缓存等。*/
觉得有帮助的话,打赏一下呗。。