代理模式 -- Proxy

2017-04-03 15:57:20   最后更新: 2017-04-03 15:57:20   访问数量:248




顾名思义,代理模式就是为其他对象提供一种代理以控制对这个对象的访问

代理对象的主要目的是为了对对象进行访问控制,来让我们在只有确实需要对象的时候才创建和初始化对象

对于一个开销很大的对象,应该根据需要进行创建,否则如果多个开销巨大的对象集中被创建和初始化将会对性能造成巨大影响,同时,对于并不是立即需要的对象,创建后也是对存储空间的浪费

例如,对于一个文本编辑器,一个巨大的图像对象应该只在第一次变为可见时才创建,但是不能在整个文本被创建时统一创建,但是这又出现了一个新的问题,我们如何才能在创建整个文本时隐藏需要被创建的图像对象呢?这个问题的解决方案是使用另一个对象,也就是代理对象,来替代真正的图像对象,而真正的图像对象则作为这个代理对象的成员存在,这样,这个代理对象就具备了完整的控制,可以在任意时刻实现真实对象的创建和初始化

 

下面是一些可以使用 Proxy 模式的常见场景:

  1. 远程代理 -- 为一个对象在不同的地址空间提供局部代表
  2. 虚代理 -- 根据需要创建开销很大的对象
  3. 保护代理 -- 控制对原始对象的访问,对于不同的对象控制不同的访问权限
  4. 智能指针 -- 用一个对象取代简单的指针,一遍增加 c/c++ 语言中不安全的指针的安全性,同时,通过引用计数实现对象的自动释放,以及实现对象的加锁/解锁,以防止并发修改对象造成的问题等

 

 

 

如上图所示,Proxy 模式由以下组件构成:

  • Subject -- 定义了真实对象与代理对象共用接口的抽象类
  • RealSubject -- 真实的实体对象
  • Proxy -- 保存一个 RealSubject 对象,同时提供 Subject 定义的所有接口,来代替实体的 RealSubject,控制实体的存取,并且可能负责创建和删除他

 

对于远程代理,Proxy 对象负责对请求及其参数进行编码,并且向不同地址空间中的实体发送编码后的请求

虚代理可能需要缓存实体对象的某些属性或附加信息,以便延迟对他的访问,例如上面的例子中,我们的图像代理类需要缓存实体图像的尺寸以便在文本编辑器创建时返回而不是在文本编辑器创建时执行图像的创建操作

保护代理则需要检查调用者是否有实现一个请求所必须的访问权限

总而言之,Proxy 类与 RealSubject 类均实现了对外提供的 Subject 类所声明的接口,这样,Proxy 就可以完全替代 RealSubject 而存在了,当 Client 发起请求时,Proxy 类接收请求并在必要的时候转发给 RealSubject 处理

Subject 让 Proxy 类可以在无需知道具体的实体类类型的情况下实现对 RealSubject 对象的操作

 






读书笔记      技术帖      龙潭书斋      面向对象      oop      代理      proxy      设计模式      design pattern      代理模式      动态代理      智能指针      指针      远程代理      虚代理      保护代理      保护      继承     


京ICP备15018585号