• 代理模式


    1. 作用

    代理模式也称为委托模式。作用就是找一个对象来替我们访问某个对象。
    意图:为其他对象提供一种代理以控制对这个对象的访问。

    为其他对象提供一种代理以控制对这个对象的访问。这样实现了业务和核心功能分离。

    抽象类视图

    分类

    • 虚拟代理:是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,使其只有在真正需要时才被创建。
    • 远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。这个不同的地址空间可以是在本机器上,也可以在另一台机器中。
    • 智能引用代理:是指当调用真实对象时,代理处理另外一些事,比如记录对此对象的调用次数等。
    • 安全代理:也叫保护代理,用来控制真实对象访问时的权限,如果有必要的话,可以给不同调用者提供不同的权限。
    • 写时拷贝代理:虚拟代理的一种,把复制推迟到只有客户的需要时才进行。
    • 缓存代理:为某一个目标的操作结果提供临时存储空间,以便其他客户的可以共享访问,有点缓存的味道。
    • 防火墙代理:保护对象,不让用户访问,安全代理的特例。
    • 同步代理:可以让几个用户同时访问同一个对象而不产生冲突。

    分类实现

    虚拟代理

    虚拟代理的主要目的是实现延迟,这里给出[DP]一书上的例子,考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的创建开销很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性创建所有开销很大的对象。这里就可以运用代理模式,在打开文档时,并不打开图形对象,而是打开图形对象的代理以替代真实的图形。待到真正需要打开图形时,仍由代理负责打开。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    // 抽象类
    class Image
    {
    public :
      Image(std::string name) : m_name(name){ }
      virtual ~Image( ){ }
      
      virtual void Show( ) = 0;      // 显示文档的函数 
      
    protected :
      std::string m_name;       // 文档名
    };
      
    // 大型实体类 
    class BigImage : public Image
    {
    public :
      BigImage(std::string name) : Image(name){ }
      virtual ~BigImage( ){ }
      
      void Show( )
      {
        std::cout <<"This is Big Image..." <<std::endl;
      }
    };
      
    // 大型图片代理器 
    class BigImageProxy : public Image
    {
    public :
      BigImageProxy(std::string name) :Image(name), m_bigImage(NULL){ }
      virtual ~BigImageProxy( )
      {
        delete m_bigImage;
      }
      
      void Show( )
      {
        if(this->m_bigImage == NULL)
        {
          m_bigImage = new BigImage(this->m_name);
        }
        m_bigImage->Show( );
      }
      
    private :
      BigImage *m_bigImage;
    };
     
    // 客户端代码 
    int main( )
    {
      Image *Image = new BigImageProxy("Image.txt");
      Image->Show( );
      delete Image;
      
      return 0;
    }

    远程代理

    远程代理多见于通讯,如网络、IPC和RPC中,一般需要提供提供了客户辅助对象和服务辅助对象,为客户辅助对象创建和服务对象相同的方法(如JAVA中的stub和skeleton),然后实现之间的具体通讯,对于client 而言stub(其实是stub和skeleton共同工作)就是其远程代理。

    智能引用代理

    最典型的应用就是智能指针的运用,相对于指针,智能指针就是对指针的代理;这个的具体实现可以参考auto_ptr或者share_ptr的实现。

    写时拷贝代理

    写时拷贝使用了虚代理和引用计数的机制,推迟拷贝动作到计数发生变化时,比较典型的运用如std::string的内存实现;具体实现可以查看string的源码

    1
    2
    3
    std::string str1 = "fine";
    std::string str2 = str1; //执行后str2 str1 的 data 地址是一样的;
    str2[0] = 'w'//执行后str2 地址发生变化
  • 相关阅读:
    synchronize模块
    ansible 的user模块
    copy src remote_src false表示本地,true在远程
    import_tasks: tasks/sometasks.yml
    ansible 变量传递到include
    ansible unarchive模块
    防火墙在setup进入不了
    telegram汉化和代理
    Ubuntu 18.04 一键安装深度截图工具 Deepin Screenshot
    8086汇编语言程序设计——子程序与模块化
  • 原文地址:https://www.cnblogs.com/zf-blog/p/13433193.html
Copyright © 2020-2023  润新知