设计模式--代理(Proxy)模式


概念

代理模式是一种常用的结构型设计模式,它提供了一种将对象与它的职责进行解耦的方式。代理模式主要涉及两个角色:代理(Proxy)真实对象(Real Object)。代理对象接收客户端的请求,并在必要时将请求转发给真实对象。这种设计模式主要用于以下几种情况:

  • 远程代理:为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
  • 虚拟代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
  • 保护(保护)代理:控制对一个对象的访问。可以给不同的用户提供不同级别的使用权限。
  • 缓存代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。


示例

Subject.h

#ifndef _SUBJECT_H_  
#define _SUBJECT_H_  
#include <iostream>  
  
class Subject {  
public:  
    virtual void Request() = 0;  
    virtual ~Subject() {} // 添加虚析构函数以确保正确析构  
};  
  
class RealSubject : public Subject {  
public:  
    void Request() override {  
        std::cout << "真实的请求" << std::endl;  
    }  
};  
  
class Proxy : public Subject {  
private:  
    RealSubject* realSubject;  
  
public:  
    Proxy() : realSubject(nullptr) {}  
  
    void Request() override {  
        if (nullptr == this->realSubject) {  
            this->realSubject = new RealSubject();  
        }  
        this->realSubject->Request();  
    }  
  
    ~Proxy() override {  
        delete realSubject; // 在析构函数中删除真实对象  
    }  
};  
  
#endif

main.cpp

#include <memory>
#include "Subject.h"

int main() {
    std::unique_ptr<Proxy> proxy = std::make_unique<Proxy>();
    proxy->Request();

    return 0;
}

/*
输出:
真实的请求
*/

上述代码是一个简单的代理模式的实现。在这个实现中,定义了一个抽象基类 Subject,它有一个纯虚函数 Request(),以及一个空的虚析构函数。这个基类的作用是定义了一个通用接口,所有实现了这个接口的类都应该能够处理 Request() 调用。

RealSubject 类是 Subject 的一个具体实现。它实现了 Request() 方法,当调用这个方法时,它会输出“真实的请求”。

Proxy 类也是 Subject 的一个实现,但它并不直接处理请求。相反,它持有一个指向 RealSubject 的指针,并在其 Request() 方法被调用时,如果 realSubject 还没有被初始化,就创建一个新的 RealSubject 实例。然后,它调用 realSubjectRequest() 方法来实际处理请求。

Proxy 类的析构函数中,释放了 realSubject 所占用的内存。这是为了防止内存泄漏,因为 Proxy 类负责管理 RealSubject 对象的生命周期。

使用代理模式的优点:

  1. 封装和抽象:代理模式隐藏了真实对象的实现细节,使得客户端代码可以独立于真实对象的类。
  2. 延迟初始化:通过懒加载(lazy loading),Proxy 类可以在第一次需要时才创建 RealSubject 对象,这有助于减少启动时间或资源使用。
  3. 资源管理Proxy 类的析构函数确保了 RealSubject 对象在其不再需要时被正确删除,避免了内存泄漏。
posted @   guanyubo  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示