代理模式
- 代理模式的定义
- 为其他对象提供一种代理以控制对这个对象的访问
-
- Proxy:代理对象
- 实现与具体的目标对象一样的接口,这样就可以使用代理来代替具体的目标对象。保存一个指向具体目标对象的引用,可以在需要的时候调用具体的目标对象。可以控制对具体目标对象的访问,并可以负责创建和删除它
- Subject:目标接口,定义代理和具体目标对象的接口,这样就可以在任何使用具体目标对象的地方使用代理对象
- RealSubject:具体的目标对象,真正实现目标接口要求的功能
/* * 抽象的目标接口,定义具体的目标对象和代理公用的接口 * */ public interface Subject { /* * 示意方法:一个抽象的请求方法 * */ public void request(); } /* * 具体的目标对象,是真正被代理的对象 * */ public class RealSubject implements Subject { @Override public void request() { // 具体执行的功能处理 } } /* * 代理对象 * */ public class Proxy implements Subject { /* * 持有被代理的具体的目标对象 * */ private RealSubject realSubject; /* * 构造方法,传入被代理的具体的目标对象 * @param realSubject是被代理的具体的目标对象 * */ public Proxy(RealSubject realSubject) { this.realSubject = realSubject; } @Override public void request() { // 在转调具体的目标对象前,可以执行一些功能处理 // 转调具体的目标对象的方法 realSubject.request(); // 转调具体的目标对象后,可以执行一些功能处理 } }
- Proxy:代理对象
- 代理模式的功能
- 代理模式是通过创建一个代理对象,用这个代理对象去代表真实的对象,客户端得到这个代理对象后,对客户端并没有什么影响,就跟得到了真实对象一样来使用
- 正是因为有代理对象夹在客户端和被代理的真实对象中间,相当一个中转,那么在中转的时候就可以进行一些操作,例如判断权限
- 代理的分类
- 虚代理:根据需要来创建开销很大的对象,该对象只有在需要的时候才会被真正创建
- 代理远程:用来在不同的地址空间上代表同一个对象,这个不同的地址空间可以是在本机上,也可以在其他机器上。在Java里面最典型的就是RMI技术
- copy-on-write代理:在客户端操作的时候,只有对象确实改变了,才会真正的拷贝(或克隆)一个目标对象,算是虚代理的一个分支
- 保护代理:控制对原始对象的访问,如果有需要,可以给不同的用户提供不同的访问权限,以控制他们对原始对象的访问
- Cache代理:为那些昂贵操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果
- 防火墙代理:保护对象不被恶意用户访问和操作
- 同步代理:使多个用户能同时访问目标对象而没有冲突
- 智能指引:在访问对象时执行一些附加操作,比如,对指向实际对象的引用计数、第一次引用一个持久对象时,将它装入内存等
- 代理模式的特点
- 代理模式的本质
- 控制对象访问
- 何时选用代理模式
- 需要为一个对象在不同的地址空间提供局部代表的时候,可以使用远程代理
- 需要按照需要创建开销很大的对象的时候,可以使用虚代理
- 代理模式的本质