设计模式--代理(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
对象在其不再需要时被正确删除,避免了内存泄漏。
多用组合、少用继承
基于接口而非实现进行编程
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库