代理模式

  • 代理模式是为其他对象提供一种代理以控制和对这个对象的访问;
  • 在代理模式中,问哦们创建具有现有对象的对象,以便想外界提供功能接口;
  • 在某种情况下,一个对象不舍和或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用
  • 意图:为其他对象提供一种代理以控制对这个对象的访问;
  • 解决的问题: 在直接访问对象时带来一些问题,如:要访问的对象在远程的机器桑。在面向对象的系统中(比如创建对象的开销很大,或者某些操作需要控制,或者需要远程的访问),直接访问会给使用者或者系统带来很多的麻烦,物品们可以在访问对象时家上一个对此对象的访问层;
  • 使用时机:想在访问一个类时做一些控制;
  • 解决方法:增加中间层;
  • 关键代码:实现与被代理类的组合;
  • 优点:
    职责清晰、高扩展性、智能化
  • 缺点 :
    1、由于在客户端和帧是主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢;
    2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂;

实例:
我们船舰一个Image接口和实现了Image接口的实体类。ProxyImage是一个代理类,减少RealImage对象加载的内存占用,原理框图如下:

代理模式框图.PNG
  • 代码实现:
#include <iostream>
#include <string>
using namespace std;

//创建接口类
class ImageInterface
{
    public:
        virtual void display()=0; //纯虚函数,不允许该类创建实例
};
//创建实体类
class RealImage:public ImageInterface
{
    private:
        string *m_fileName;
    public:
        void loadFromDisk(string *fileName)
        {
            cout<<"Loading "<<(*fileName)<<endl;
        }
        RealImage(string *fileName)
        {
            m_fileName = fileName;
            loadFromDisk(fileName);
        }

        //@override
        virtual  void display()
        {
            cout<<"Display "<<(*m_fileName)<<endl;
        }
};

//创建代理类
class ImageProxy:public ImageInterface
{
    private:
        RealImage *m_realImage;
        string *m_fileName;
    public:
        ImageProxy(string *fileName)
        {
            m_fileName = fileName;
        }
        //@override
        virtual void display()
        {
            if(m_realImage == NULL)
            {
                m_realImage = new RealImage(m_fileName);
            }
            m_realImage->display();
        }
};

//编写测试案例
int main()
{
    // 1、获取代理对象
    
    string filname="snow.jpeg";
    ImageInterface *image = new ImageProxy(&filname);

    // 2、图像需要从磁盘加载
    image->display();

    // 图像不需要从磁盘中加载
    image->display();
}

///////////////////////输出结果/////////////////////////
Loading snow.jpeg
Display snow.jpeg
Display snow.jpeg

从输出结果可以看出调用了代理对象两次display()函数,只加载了一次,节省了内存资源。
注:如何用对象而不用指针实现

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容