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

     二、缺点分析:

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

  • 相关阅读:
    VUE的生命周期
    ID生成算法(二)
    ID生成算法(一)——雪花算法
    HTTP状态码和支持的方法
    水平居中/垂直居中/水平垂直居中总结
    判断数组类型的4种方法
    WebSocket浅谈
    vue中使用定时器时this指向
    银行转账业务梳理
    支付那些事儿
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/13578377.html
Copyright © 2020-2023  润新知