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全部的宗旨就是尽可能简化远程接口对象的使用。
- 什么时候用:
- 远程代理为不同地址空间中的对象提供本地代表。
- 虚拟代理根据需要创建昂贵的对象。
- 保护代理控制对原始对象的访问。
- 智能引用是一个空指针的替代,空指针在访问对象时执行额外的操作。
- 计算对真实对象的引用数量,以便在没有更多引用时自动释放(智能指针)。
- 加载持久对象(持久化对象)到内存的时候第一次引用。
- 在访问真实对象之前检查它是否被锁定,以确保没有其他对象可以更改它。
- 结构:
- 后果:
- 远程代理可以隐藏对象驻留在不同地址空间的事实。
- 虚拟代理可以执行优化,如按需创建对象。
- 保护代理和智能引用都允许访问控制等附加功能。(在适用性页面显示)
- 写时拷贝:
- 复制一个大而复杂的对象可能是一项昂贵的操作。如果副本从来没有被修改过,那么就没有必要产生这个成本。通过使用代理来推迟复制过程,我们确保只在对象被修改时才复制它。
- 扩展:透明代理
- 代理并不总是需要知道真实主题的类型。
- 如果一个代理类可以通过一个抽象接口单独处理它的subject,那么就不需要为每个RealSubject类创建一个代理类;该代理可以统一处理所有RealSubject类。
- 但是如果代理要实例化,那么他们必须知道具体的类。
- 动机: