C++编程代理设计模式
·
代理设计模式
1. 功能和作用
代理模式(Proxy Pattern)为其他对象提供一种代理以控制对这个对象的访问。主要作用包括:
- 访问控制:限制对真实对象的直接访问
- 功能增强:在访问真实对象前后添加额外操作
- 延迟加载:推迟高开销对象的创建直到真正需要时
- 远程代理:为不同地址空间的对象提供本地代表
2. 原理
通过引入代理类实现:
- 代理类与真实类实现相同接口
- 客户端通过代理间接访问真实对象
- 代理在调用真实对象前后可执行附加操作
3. 使用方式
4. 设计原因
- 解耦:将客户端与真实对象解耦
- 保护:控制敏感对象的访问权限
- 优化:避免不必要的资源消耗(如大文件加载)
- 扩展:不修改原对象即可添加新功能
5. 适用场景
- 远程方法调用(RPC)
- 权限控制系统
- 虚拟代理(如图片懒加载)
- 缓存代理
- 智能引用(引用计数)
6. 时序图
7. C++ 实现
#include <iostream>
// 抽象接口
class Subject {
public:
virtual void request() = 0;
virtual ~Subject() = default;
};
// 真实对象
class RealSubject : public Subject {
public:
void request() override {
std::cout << "真实对象处理请求" << std::endl;
}
};
// 代理类
class Proxy : public Subject {
private:
RealSubject* realSubject;
public:
Proxy() : realSubject(nullptr) {}
~Proxy() { delete realSubject; }
void request() override {
if (!realSubject) {
realSubject = new RealSubject();
}
preRequest();
realSubject->request();
postRequest();
}
private:
void preRequest() {
std::cout << "代理前置处理" << std::endl;
}
void postRequest() {
std::cout << "代理后置处理" << std::endl;
}
};
// 客户端
int main() {
Proxy proxy;
proxy.request();
return 0;
}
编译运行测试
g++ -std=c++11 -o proxy proxy.cpp && ./proxy
输出结果:
代理前置处理
真实对象处理请求
代理后置处理
8. 总结
优点:
- 职责清晰:代理专注于访问控制,真实对象专注核心业务
- 高扩展性:可动态添加新代理类型
- 高灵活性:支持延迟加载和远程访问
- 安全性:隐藏真实对象细节
缺点:
- 性能开销:增加代理层导致调用延迟
- 复杂度增加:需维护额外代理类
- 可能违反开闭原则:修改真实对象需同步更新代理
改进方向:
- 动态代理:通过反射机制动态创建代理
- 代理链:多个代理形成处理流水线
- 智能代理:集成AI决策访问策略
该模式在软件架构中应用广泛,特别是在分布式系统和资源管理场景,能有效平衡系统灵活性和安全性。
更多推荐

所有评论(0)