美文网首页设计模式C++实现笔记
Proxy 代理模式(结构型模式)

Proxy 代理模式(结构型模式)

作者: lixin_karl | 来源:发表于2019-02-24 16:31 被阅读0次

    介绍

      代理模式为其他对象提供一种代理以控制这个对象的访问,其目的就是为了延迟所代理对象的创建,因为有的对象创建开销十分大,从而影响用户体验,比如:考虑一个可以嵌入图像的文档编辑器,有些图像创建的开销很大,但是打开文档必须迅速,我们可以延迟图像对象的创建。

    代理模式的参与者

    • Proxy 保存一个引用,使得代理对象可以访问实体
    • Subject 定义实体和代理的共用接口
    • RealSubject 代理的实体

    实现代码

    class Graphic{//Subject 定义实体和代理的共用接口
    public:
        virtual ~Graphic(){}
        virtual  void Draw() = 0;
        virtual void Save() = 0;
        virtual void Load() = 0;
    };
    
    class Image : public Graphic {//RealSubject 代理的实体
    public:
        Image(std::string place)
        {
            _place = place;
        }
        void Draw() override
        {
            std::cout<<"Drawing......"<<std::endl;
        }
        void Save() override
        {
            std::cout<<"Saving..... in "<<_place<<std::endl;
        }
        void Load() override
        {
            std::cout<<"Loading.... from "<<_place<<std::endl;
        }
    private:
        std::string _place;
    };
    
    class ImageProxy : public Graphic {//Proxy 保存一个引用,使得代理对象可以访问实体
    public:
        ImageProxy(std::string place)
        {
            image = nullptr;
            _place = place;
        }
        void Draw() override
        {
            if(image == nullptr)
            {
                std::cout<<"new Image in Draw()"<<std::endl;
                image = new Image(_place);
            }
            image->Draw();
        }
        void Save() override
        {
            if(image == nullptr)
            {
                std::cout<<"new Image in Save()"<<std::endl;
                image = new Image(_place);
            }
            image->Save();
        }
        void Load() override
        {
            if(image == nullptr)
            {
                std::cout<<"new Image in Load()"<<std::endl;
                image = new Image(_place);
            }
            image->Load();
        }
    private:
        Image *image;
        std::string _place;
    };
    
    int main()
    {
        ImageProxy *proxy = new ImageProxy("d:/images");
        proxy->Draw();
        proxy->Load();
        proxy->Save();
    };
    

    输出

    new Image in Draw()
    Drawing......
    Loading.... from d:/images
    Saving..... in d:/images
    

    特点

    • 远程代理可以影藏一个对象存在于不同空间地址的事实
    • 虚拟代理可以进行最优化,例如根据要求创建对象
    • 保护代理,智能引用都允许在访问一个对象时有一些附加的事务处理

    参考

    《设计模式:可复用面向对象软件的基础》

    相关文章

      网友评论

        本文标题:Proxy 代理模式(结构型模式)

        本文链接:https://www.haomeiwen.com/subject/mxkbyqtx.html