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

     二、缺点分析:

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

  • 相关阅读:
    PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
    PHP提取字符串中的手机号正则表达式怎么写
    关于PHP如何用实现防止用户在浏览器上使用后退功能重复提交输入
    php解析url并得到url中的参数
    Linux25_安装CentOS服务器并配置
    Linux24_编译安装软件
    Android16_Binder连接池
    Android15_IPC方式之Bundle及文件共享
    Android14_IPC方式之Socket
    Android13_IPC方式之ContentProvider
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/13578377.html
Copyright © 2011-2022 走看看