设计模式--代理(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 实例。然后,它调用 realSubject 的 Request() 方法来实际处理请求。
在 Proxy 类的析构函数中,释放了 realSubject 所占用的内存。这是为了防止内存泄漏,因为 Proxy 类负责管理 RealSubject 对象的生命周期。
使用代理模式的优点:
- 封装和抽象:代理模式隐藏了真实对象的实现细节,使得客户端代码可以独立于真实对象的类。
 - 延迟初始化:通过懒加载(lazy loading),
Proxy类可以在第一次需要时才创建RealSubject对象,这有助于减少启动时间或资源使用。 - 资源管理:
Proxy类的析构函数确保了RealSubject对象在其不再需要时被正确删除,避免了内存泄漏。 
    Do not communicate by sharing memory; instead, share memory by communicating.

                
            
        
浙公网安备 33010602011771号