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(); }
二、缺点分析:
只实现了一类别的代理,没有实现所有类型的代理。