结构型模式-代理模式

发布时间 2023-11-10 15:49:48作者: Qt小罗

1 什么是代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它允许通过代理对象控制对原始对象的访问。代理模式在不改变原始对象的情况下,为其提供了一个替代品或占位符,从而可以在访问链上添加额外的逻辑功能。

2 举个例子

下面以一个简单的图片加载器为例来说明代理模式的应用。假设我们有一个图片加载器 ImageLoader,它用于从磁盘加载图片并显示到屏幕上。

首先,我们定义一个共同的图像接口 Image,其中包含了加载和显示图片的方法:

class Image {
public:
    virtual void display() const = 0;
    virtual ~Image() {}
};

然后,我们创建具体的图像类 RealImage,它实现了图像接口,并负责从磁盘加载图片并显示到屏幕上:

class RealImage : public Image {
private:
    string filename;

public:
    RealImage(const string& filename) : filename(filename) {
        loadFromDisk();
    }

    void display() const override {
        cout << "Displaying image: " << filename << endl;
    }

    void loadFromDisk() {
        cout << "Loading image from disk: " << filename << endl;
    }
};

接下来,我们创建代理类 ImageProxy,它也实现了图像接口,并在需要时延迟创建和加载真实的图像对象:

class ImageProxy : public Image {
private:
    string filename;
    RealImage* realImage;

public:
    ImageProxy(const string& filename) : filename(filename), realImage(nullptr) {}

    void display() const override {
        if (realImage == nullptr) {
            realImage = new RealImage(filename);
        }
        realImage->display();
    }
};

在客户端代码中,我们可以通过代理类 ImageProxy 来间接访问图像对象,代理类在需要时创建并加载真实的图像对象,并调用真实图像对象的方法进行显示:

int main() {
    Image* image = new ImageProxy("image.jpg");

    // 第一次显示,代理对象会创建并加载真实的图像对象
    image->display();

    // 第二次显示,代理对象直接使用已经创建的真实图像对象
    image->display();

    delete image;

    return 0;
}

在上述示例中,我们创建了一个代理类 ImageProxy,它控制着对真实图像对象 RealImage 的访问。在第一次调用 display 方法时,代理类 ImageProxy 会创建并加载真实的图像对象,并调用真实图像对象的 display 方法进行显示。在接下来的调用中,代理类 ImageProxy 直接使用已经创建的真实图像对象进行显示。

3 总结

代理模式的优点在于可以控制和管理访问对象的方式,从而实现了对原始对象的封装和保护。它还可以降低系统的耦合性,因为代理对象可以独立于真实对象而存在。此外,代理模式还支持延迟加载(懒加载),在需要时才创建和加载真实的对象,从而提高了系统的性能。