代理模式

概念

代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问.


适用场景

1. 远程代理(Remote Proxy) 为一个位于不同的地址空间的对象提供一个本地的代理对象. 这个不同的地址空间即不同的进程, 它可以在同一台主机中, 也可以在另一台主机中, 如java的RMI
2. 虚拟代理(Virtual Proxy) 是创建开销大的对象的代表. 虚拟代理经常直到我们真正需要一个对象的时候才创建它.当对象正在创建前和创建中时,由虚拟代理来扮演对象的替身.对象创建后, 代理就会将请求直接委托给对象
3. 保护代理(Protection Proy) 控制对原始对象的访问. 代理对象一般用于对象有不同的访问权限的时候.
4. 智能引用代理(Smart Reference Proxy) 当主题被引用时,进行额外的动作,例如计算一个对象被引用的次数. 常用于对资源生命周期的控制, 如c++中的shared_ptr等
5. 缓存代理(Caching Proxy) 为开销大的运算结果提供暂时存储:它也允许多个客户共享结果,以减少计算或网络延迟. 常出没于web服务器代理,以及内容管理与出版系统.
6. 同步代理(Synchronization Proxy) 在多线程的情况下为主题提供安全的访问. 被发现出没于JavaSpaces,为分散式环境内的潜在对象集合提供同步访问控制.
7. 复杂隐藏代理(Complexity Hiding Proxy) 用来隐藏一个类的复杂集合的复杂度,并进行访问控制.有时候也成为外观代理(Facade Proxy),这不难理解.复杂隐藏代理和外观模式是不一样的,因为代理控制访问,而外观模式只提供另一组接口.
8. 写时复制代理(Copy-On-Write Proxy) 用来控制对象的复制,方法是延迟对象的复制,直到客户真的需要为止.这是虚拟代理的变体. 常见于容器类, 如Qt的Qtl, QString等
9. 防火墙代理(Firewall Proxy) 控制网络资源的访问,保护主体免于"坏客户"的侵害. 常出没于公司的防火墙系统.

结构


抽象主题角色(Subject)  为真实主题(RealSubject)和代理(Proxy)定义相同的接口/函数, 这样就可以在任何使用RealSubject的地方使用Proxy. 代理通过持有真实主题的引用/指针
代理角色(Proxy)  持有RealSubject的引用/指针. 在某些情况下, Proxy还会负责ReadSubject对象的创建与销毁.客户和RealSubject的交互都必须通过Proxy.Proxy可以取代RealSubject.Proxy也控制了对RealSubject的访问.
真实主题角色(RealSubject) 是真正做事的对象, 它是被Proxy代理和控制访问的对象.

优缺点

优点

1. 代理模式避免客户直接访问目标对象, 而是通过为目标对象提供一个代表, 这个代表即可以管理目标对象, 也可以控制对目标对象的访问. 
2. 代理模式可以隐藏一些细节, 从而让用户更加专心的实现业务, 提高内聚. 例如远程代理, 客户调用的对象其实是通过网络访问另一个进程中的对象,但用户并不关心网络通信细节, 这样的实现细节完全交给代理去做, 用户就像是在访问本进程资源一样.
3. 代理模式易于为调用添加一些附加处理
4. 代理模式实现对资源的有效控制, 如写时复制技术
5. 代理模式可以有效协调调用者和被调用者, 在一定程度上降低了系统的耦合度

缺点

1. 和其他的包装者(wrapper)一样,代理会造成你的设计中类的数目的增加.
2. 由于在客户端和真实主题之间增加了代理对象, 有些类型的代理模式可能会造成请求的处理速度变慢
3. 实现代理模式需要额外的工作, 有些代理模式的实现非常复杂.


装饰者模式的对比

代理在结构上类似装饰者, 但是目的不同. 装饰者为对象加上行为,而代理则是控制访问.
装饰者通过包装对象为对象增加新的行为, 不会实例化任何东西;
而代理模式代表对象, 不仅为对象加上新的动作, 并控制对对象的访问, 有时会创建对象.


适配器模式的对比

适配器为它所适配的对象提供了一个不同的接口.相反, 代理提供了与它的实体相同的接口.


实现

待补充



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值