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

     二、缺点分析:

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

  • 相关阅读:
    Linux设备模型 学习总结
    平衡二叉树
    数字在排序数组中出现的次数
    两个链表的第一个公共节点
    第一个只出现一次的字符
    丑数
    把数组排成最小的数
    剑指offer 连续子数组的最大和
    查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部
    for each
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/13578377.html
Copyright © 2011-2022 走看看