设计模式——代理模式

打印 上一主题 下一主题

主题 875|帖子 875|积分 2625

一、界说与概念



  • 界说
    C++ 代理模式(Proxy Pattern)是一种布局型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在代理模式中,存在一个真实对象(被代理对象)和一个代理对象,客户端通过代理对象来间接访问真实对象,代理对象可以在访问真实对象前后进行一些额外的操作,比如权限检查、延迟加载、缓存等。
  • 焦点头脑
    通过引入代理对象来代替真实对象处理客户端的请求,代理对象和真实对象实现雷同的接口,这样对于客户端来说,它不需要知道是在与真实对象照旧代理对象打交道,而代理对象可以在须要时对请求进行预处理或后处理。
二、布局和组成部分

抽象主题(Subject)接口



  • 界说:
    这是真实对象和代理对象共同实现的接口,它界说了客户端可以调用的方法,确保了客户端对真实对象和代理对象的使用具有一致性。
  • 代码示例(简单的文件读取接口)
  1. class FileReaderSubject {
  2. public:
  3.     virtual std::string readFile(const std::string& fileName) = 0;
  4.     virtual ~FileReaderSubject() {}
  5. };
复制代码
真实主题(Real Subject)



  • 界说:
    真实主题是被代理的对象,它实现了抽象主题接口,提供了真实的功能实现。
  • 代码示例(实际的文件读取类)
  1. class RealFileReader : public FileReaderSubject {
  2. public:
  3.     std::string readFile(const std::string& fileName) override {
  4.         std::ifstream file(fileName);
  5.         if (file.is_open()) {
  6.             std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
  7.             file.close();
  8.             return content;
  9.         }
  10.         return "File not found or cannot be opened.";
  11.     }
  12. };
复制代码
代理(Proxy)



  • 界说:
    代理类也实现了抽象主题接口,它内部包含一个指向真实主题的指针。代理类在实现接口方法时,通常会先进行一些额外的操作,然后再调用真实主题的相应方法,最后可能还会进行一些后续操作。
  • 代码示例(文件读代替理类,带缓存功能)
  1. class FileReaderProxy : public FileReaderSubject {
  2. private:
  3.     RealFileReader* realReader;
  4.     std::unordered_map<std::string, std::string> fileCache;
  5. public:
  6.     FileReaderProxy() : realReader(nullptr) {}
  7.     std::string readFile(const std::string& fileName) override {
  8.         if (fileCache.find(fileName)!= fileCache.end()) {
  9.             return fileCache[fileName];
  10.         }
  11.         if (!realReader) {
  12.             realReader = new RealFileReader();
  13.         }
  14.         std::string content = realReader->readFile(fileName);
  15.         fileCache[fileName] = content;
  16.         return content;
  17.     }
  18.     ~FileReaderProxy() {
  19.         delete realReader;
  20.     }
  21. };
复制代码
三、应用场景

远程代理



  • 解释:
    当客户端需要访问位于远程服务器上的对象时,可以使用远程代理。远程代理在本地代表远程对象,它负责与远程服务器进行通信,将客户端的请求发送到远程服务器,并将远程服务器的相应返回给客户端。这样,客户端就可以像访问本地对象一样访问远程对象,隐藏了远程调用的复杂性。
  • 示例:
    在分布式系统中,一个客户端想要访问远程数据库中的数据。通过创建远程数据库对象的代理,代理负责将客户端的数据查询请求发送到远程数据库服务器,接收服务器返回的数据,并将其通报给客户端。
捏造代理



  • 解释:
    捏造代理用于在需要时才创建和初始化被代理的对象,通常用于处理资源密集型对象。当客户端请求访问一个对象时,如果该对象尚未创建或初始化,捏造代分析先进行一些轻量级的操作,如表现一个占位符,然后在合适的时候再创建和初始化真实对象,并将客户端的请求转发给真实对象。
  • 示例:
    在一个图像浏览系统中,当用户浏览图像列表时,图像可能是高分辨率的资源密集型对象。此时可以使用捏造代理,在图像未完全加载之前,代理表现一个低分辨率的占位图像,当用户真正点击查看某张图像时,捏造代理再去加载和表现高分辨率的真实图像。
掩护代理



  • 解释:
    掩护代理用于控制对真实对象的访问权限。它可以在客户端访问真实对象之进步行权限检查,如果客户端具有访问权限,则答应访问,否则拒绝访问。这样可以掩护真实对象不被未授权的客户端访问。
  • 示例:
    在企业内部的文件管理系统中,有一些秘密文件只有特定的用户角色(如管理员或具有特定权限的员工)可以访问。通过使用掩护代理,在用户请求访问文件时,代理先检查用户的权限,如果权限符合要求,则调用真实的文件读取操作,否则返回访问被拒绝的提示。
四、优缺点

优点



  • 访问控制:
    可以有用地控制对真实对象的访问,通过代理对象进行权限检查等操作,掩护真实对象的安全性。
  • 增强功能:
    代理对象可以在不改变真实对象的基础上,为真实对象添加额外的功能,如缓存、延迟加载、性能优化等,进步了系统的机动性和可扩展性。
  • 解耦:
    代理模式将客户端与真实对象解耦,客户端不需要相识真实对象的详细实现细节,即使真实对象的实现发生厘革,只要代理对象和真实对象之间的接口稳定,客户端代码就不需要修改。
缺点



  • 增长复杂性:
    引入代理对象增长了系统的复杂性,特别是当存在多个代理类且它们的逻辑较为复杂时,代码的理解和维护本钱会增长。
  • 性能开销:
    在某些情况下,代理对象的额外操作(如权限检查、缓存管理等)可能会带来一定的性能开销,尤其是在对性能要求极高的场景中,需要谨慎考虑代理模式的使用。
代理模式在许多场景下可以或许为系统带来诸多好处,但需要综合考虑其优缺点,根据实际需求合理使用。

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

使用道具 举报

0 个回复

正序浏览

快速回复

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

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表