zoukankan      html  css  js  c++  java
  • 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();
    }

     二、缺点分析:

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

  • 相关阅读:
    Mysql事后触发器练习
    基础算法2.1——枚举法
    JSP第二次作业:使用session记录次数的猜数游戏
    JSP第一次作业:使用Cookie记录用户上次访问时间
    Python数据清洗见闻
    Python作业碎碎念
    数组那些事儿
    %1e9+7问题收录
    DB2数据库关于delete in id和batch delete的性能对比
    关于sql知识全面总结
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/13578377.html
Copyright © 2011-2022 走看看