C++代理模式的实现
一、C++实现代理模式的原理
代理我们都知道是代为转发的意思,转发过程对函数进行拦截和处理。因为c++本身是不支持反射的,所以可以利用c++面向对象继承的特性进行处理。
我们定义公共接口:
class IBox { public: IBox() = default; virtual ~IBox() = default; virtual void Open() {}; virtual void Close() {}; private: };
实现需要被拦截的类:
class BigBox:public IBox { public: BigBox(); ~BigBox() override; void Open() override; void Close() override; private: }; BigBox::BigBox(){ } BigBox::~BigBox(){ } void BigBox::Open() { cout << "big box open." << endl; } void BigBox::Close() { cout << "big box close." << endl; }
实现代理:
class BoxProxy: public IBox { public: BoxProxy(IBox* box); ~BoxProxy(); void Open() override; void Close() override; private: IBox *m_box; void beforeFunc(); void afterFunc(); }; BoxProxy::BoxProxy(IBox *box) :m_box(box){ } BoxProxy::~BoxProxy(){ delete m_box; m_box == nullptr; } void BoxProxy::beforeFunc() { cout << "from proxy,invoke before:"<< std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()) << endl; } void BoxProxy::afterFunc() { cout << "from proxy,invoke after:"<<std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()) << endl; } void BoxProxy::Open() { beforeFunc(); m_box->Open(); afterFunc(); } void BoxProxy::Close() { beforeFunc(); m_box->Close(); afterFunc(); }
注意,此中需要注意的是,我们要传入需要被代理的类,对接口中的方法进行加工。
最后我们调用:
int main() { BigBox* box = new BigBox(); BoxProxy* boxP = new BoxProxy(box); boxP->Open(); boxP->Close(); }
二、缺点分析:
只实现了一类别的代理,没有实现所有类型的代理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧