• 代理模式(C++)


       年过完了,开始上班了,时间过得太快了,感觉过了个假年........

      代理模式:为其他对象提供一种代理,以控制这个对象的访问。

      角色分工:Subject:抽象角色,声明对真实对象和代理对象的共同接口;Proxy:代理角色,代理真实对象的访问;RealSubject:真实角色,最终需要引用的对象。

      代理模式主要分为四类:远程代理、虚代理、保护代理、智能引用

      下面笔记,主要记录虚代理,关于远程代理、保护代理、智能引用等,可以查查资料,其核心思想都是跟其定义一样。特别提下,智能引用其实跟可以参考智能指针的实现,采用引用计数,可以参考:http://www.cnblogs.com/huiz/p/8313209.html

      虚代理:可以缓存实体的附加信息,以便延迟对它的访问,直到我们真正需要一个对象的时候才创建它

      例如:在项目中,我们经常需要加载资源,在开机就立即加载所有的资源,会导致一些性能问题,如开机时间太长等,有需要需要在真正需要的时候再去加载resources,我们可以定义代理类,在代理类里面加载真实对象的resources,这样就可以实现延迟加载。具体可以看UML类图:

    再看看代码:

    #include <iostream>
    using namespace std;
    
    class Base //Subject
    {
    public:
        virtual void requestLoader() = 0;
        virtual ~Base(){}
    };
    
    class Control : public Base //RealSubject
    {
    public:
        virtual void requestLoader()
        {
            cout<<"request loader resources."<<endl;
        }
    };
    
    class Proxy : public Base //proxy
    {
    private:
        Control* m_con;
    public:
        Proxy(Control* con):m_con(con){}
        virtual void requestLoader()
        {
            m_con->requestLoader();
        }
        ~Proxy()
        {
            if(NULL != m_con)
            {
                delete m_con;
                m_con = NULL;
            }
        }
    };
    
    
    int main(int argc, char** argv)
    {
        Control* con = new Control;
        Proxy* pr = new Proxy(con);
        pr->requestLoader();
        delete pr;
        pr = NULL;
    
        return 0;
    }

    输出如下:

      以上代码在VC6.0上运行通过,如有问题,还请多多指教,在此先谢过了哈。

      

  • 相关阅读:
    JS加密对应的c#解码
    Content-Type: application/www-form-urlencoded
    使用abcpdf分页设置的问题
    Windows10远程报错:由于CredSSP加密Oracle修正
    ueditorUE 去掉本地保存成功的提示框!
    js进制转换
    缓存穿透 缓存雪崩 缓存击穿
    DTcms 模版用vs2015或2017 打开编辑时候 粘贴出问题 代码被调整
    通俗简述 依赖倒置•控制反转•依赖注入•面向接口编程 的思想
    tcp/ip
  • 原文地址:https://www.cnblogs.com/huiz/p/8464538.html
Copyright © 2020-2023  润新知