zoukankan      html  css  js  c++  java
  • 代理模式

    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 地址发生变化
  • 相关阅读:
    hibernate_0100_HelloWorld
    MYSQL子查询的五种形式
    JSF是什么?它与Struts是什么关系?
    nop指令的作用
    htmlparser实现从网页上抓取数据(收集)
    The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when the
    FCKeditor 在JSP上的完全安装
    Java遍历文件夹的2种方法
    充电电池和充电时间说明
    吃知了有什么好处
  • 原文地址:https://www.cnblogs.com/zf-blog/p/13433193.html
Copyright © 2011-2022 走看看