C++实现计划模式---代理模式 (Proxy)

打印 上一主题 下一主题

主题 907|帖子 907|积分 2721

代理模式 (Proxy)

代理模式 是一种结构型计划模式,它为其他对象提供一个代理以控制对该对象的访问。代理模式常用于耽误加载、访问控制、智能引用等场景。

意图



  • 提供对某对象的控制。
  • 控制对目标对象的访问,通常用于在不改变目标对象的情况下,附加额外的功能。
  • 常见于耽误加载、权限控制等场景。

使用场景


  • 长途代理

    • 当对象存在于不同的地址空间时,代理模式提供了对长途对象的访问。

  • 虚拟代理

    • 耽误对象的创建,只有在须要时才创建对象,避免不须要的资源消耗。

  • 保护代理

    • 控制对某个对象的访问权限。代理对象负责控制访问。

  • 智能代理

    • 对对象访问举行计数、缓存等操作。例如,记录访问次数、管理缓存等。


参与者角色


  • 主题接口 (Subject)

    • 定义了目标对象和代理类的公共接口。

  • 真实主题 (RealSubject)

    • 实现了 Subject 接口的目标对象,包罗实际业务逻辑。

  • 代理 (Proxy)

    • 代理类,持有真实主题对象的引用,代理哀求到真实主题对象,附加控制逻辑。


示例代码

以下代码展示了怎样使用代理模式控制对一个图片加载的访问。
  1. #include <iostream>
  2. #include <string>
  3. // 主题接口
  4. class Image {
  5. public:
  6.     virtual ~Image() = default;
  7.     virtual void display() = 0; // 移除 const
  8. };
  9. // 真实主题:加载并显示图片
  10. class RealImage : public Image {
  11. private:
  12.     std::string filename;
  13. public:
  14.     RealImage(const std::string& file) : filename(file) {
  15.         loadImage();
  16.     }
  17.     void loadImage() const {
  18.         std::cout << "Loading image: " << filename << std::endl;
  19.     }
  20.     void display() override {
  21.         std::cout << "Displaying image: " << filename << std::endl;
  22.     }
  23. };
  24. // 代理类:代理真实图片加载和显示
  25. class ProxyImage : public Image {
  26. private:
  27.     RealImage* realImage;
  28.     std::string filename;
  29. public:
  30.     ProxyImage(const std::string& file) : filename(file), realImage(nullptr) {}
  31.     void display() override {
  32.         if (!realImage) {
  33.             realImage = new RealImage(filename);  // 延迟加载真实图像
  34.         }
  35.         realImage->display();
  36.     }
  37.     ~ProxyImage() {
  38.         delete realImage;
  39.     }
  40. };
  41. // 客户端代码
  42. int main() {
  43.     Image* image1 = new ProxyImage("image1.jpg");
  44.     Image* image2 = new ProxyImage("image2.jpg");
  45.     // 第一次访问时加载并显示图片
  46.     image1->display();
  47.     image2->display();
  48.     // 直接显示图片,不会重新加载
  49.     image1->display();
  50.     delete image1;
  51.     delete image2;
  52.     return 0;
  53. }
复制代码

代码解析

1. 主题接口



  • Image 类定义了目标对象和代理类的公共接口。
  • 全部的图片类都须要实现 display 方法。
  1. class Image {
  2. public:
  3.     virtual ~Image() = default;
  4.     virtual void display() = 0;
  5. };
复制代码
2. 真实主题



  • RealImage 类是实际的图片对象,提供了加载和显示图片的功能。
  • loadImage 在构造函数中被调用,用于模拟加载图片。
  1. class RealImage : public Image {
  2. private:
  3.     std::string filename;
  4. public:
  5.     RealImage(const std::string& file) : filename(file) {
  6.         loadImage();
  7.     }
  8.     void loadImage() const {
  9.         std::cout << "Loading image: " << filename << std::endl;
  10.     }
  11.     void display() override {
  12.         std::cout << "Displaying image: " << filename << std::endl;
  13.     }
  14. };
复制代码
3. 代理类



  • ProxyImage 类是一个代理类,它控制对 RealImage 的访问。
  • 在 display 方法中,它会先检查 realImage 是否已被创建。如果尚未创建,则耽误加载它。
  1. class ProxyImage : public Image {
  2. private:
  3.     RealImage* realImage;
  4.     std::string filename;
  5. public:
  6.     ProxyImage(const std::string& file) : filename(file), realImage(nullptr) {}
  7.     void display() override {
  8.         if (!realImage) {
  9.             realImage = new RealImage(filename);  // 延迟加载真实图像
  10.         }
  11.         realImage->display();
  12.     }
  13.     ~ProxyImage() {
  14.         delete realImage;
  15.     }
  16. };
复制代码
4. 客户端



  • 客户端使用代理类,而不是直接使用真实主题类。
  • ProxyImage 控制了对 RealImage 的访问,并在须要时创建它。
  1. int main() {
  2.     Image* image1 = new ProxyImage("image1.jpg");
  3.     Image* image2 = new ProxyImage("image2.jpg");
  4.     image1->display(); // 加载并显示
  5.     image2->display(); // 加载并显示
  6.     image1->display(); // 直接显示
  7.     delete image1;
  8.     delete image2;
  9. }
复制代码

优缺点

优点


  • 耽误初始化

    • 代理模式可以在须要时才创建和初始化对象,避免不须要的资源消耗。

  • 控制访问权限

    • 代理对象可以控制对真实对象的访问,如权限控制、耽误加载等。

  • 增长功能而不改变目标对象

    • 通过代理,可以为目标对象添加附加功能,而无需修改目标对象。

缺点


  • 增长体系复杂度

    • 代理模式增长了对象间的间接性,可能导致体系变得复杂。

  • 性能开销

    • 使用代理时,可能会有额外的性能开销,特别是在频繁调用代理方法时。


实用场景


  • 长途代理

    • 访问长途对象时,代理对象可以替代真实对象,并处理通信。

  • 虚拟代理

    • 耽误对象的加载,当须要时才创建对象,避免不须要的资源消耗。

  • 保护代理

    • 控制对真实对象的访问权限,确保只有符合条件的用户才能访问。


总结

代理模式通过提供一个替代的对象来控制对真实对象的访问。它广泛用于耽误加载、权限控制、长途调用等场景,能够有效进步体系的机动性和可扩展性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表