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();
}

 

 二、缺点分析:

只实现了一类别的代理,没有实现所有类型的代理。

posted @ 2020-08-28 16:41  卖雨伞的小男孩  阅读(521)  评论(0编辑  收藏  举报