结构型模式-代理模式
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 总结
代理模式的优点在于可以控制和管理访问对象的方式,从而实现了对原始对象的封装和保护。它还可以降低系统的耦合性,因为代理对象可以独立于真实对象而存在。此外,代理模式还支持延迟加载(懒加载),在需要时才创建和加载真实的对象,从而提高了系统的性能。
作者QQ:115124903,欢迎交流。
每一步踏出,都是一次探索,一次成长。
每一步踏出,都是一次探索,一次成长。