17 Proxy代理模式(结构型)

17 Proxy(代理,结构型)

    • 动机:
      • 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
      • 只在必要时生成实例
      • 控制对对象的访问的一个原因是defer(推迟)创建和初始化的全部成本,直到我们需要使用它。
      • 解决方案是使用另一个对象,代理,作为真实对象的替身。
      • 也称为:Surrogate
    • JAVA RMI是JAVA RPC的版本,RPC如下,通过网络调用远端g(),回去研究一下RMI
      • Java RMI: The client helper is a ‘stub’ and the service helper is a ‘skeleton’.
      • Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。
      • 17 Proxy代理模式(结构型)
    • 什么时候用:
      • 远程代理为不同地址空间中的对象提供本地代表。
      • 虚拟代理根据需要创建昂贵的对象。
      • 保护代理控制对原始对象的访问。
      • 智能引用是一个空指针的替代,空指针在访问对象时执行额外的操作。
        • 计算对真实对象的引用数量,以便在没有更多引用时自动释放(智能指针)。
        • 加载持久对象(持久化对象)到内存的时候第一次引用。
        • 在访问真实对象之前检查它是否被锁定,以确保没有其他对象可以更改它。
    • 结构:
      • 17 Proxy代理模式(结构型)
    • 后果:
      • 远程代理可以隐藏对象驻留在不同地址空间的事实。
      • 虚拟代理可以执行优化,如按需创建对象。
      • 保护代理和智能引用都允许访问控制等附加功能。(在适用性页面显示)
      • 写时拷贝:
        • 复制一个大而复杂的对象可能是一项昂贵的操作。如果副本从来没有被修改过,那么就没有必要产生这个成本。通过使用代理来推迟复制过程,我们确保只在对象被修改时才复制它。
    • 扩展:透明代理
      • 代理并不总是需要知道真实主题的类型。
      • 如果一个代理类可以通过一个抽象接口单独处理它的subject,那么就不需要为每个RealSubject类创建一个代理类;该代理可以统一处理所有RealSubject类。
      • 但是如果代理要实例化,那么他们必须知道具体的类。