代理模式
结构如下
- Subject类:定义RealSubject类和Proxy类的公用接口,可以使得在任何使用RealSubject类的地方都可以使用Proxy类
public interface Subject{
void request();
}
- RealSubject类:定义Proxy所代表的真实实体
public class RealSubject implements Subject{
@Override
public void request(){
}
}
- Proxy类:保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体
public class Proxy implements Subject{
RealSubject realSubject;
@Override
public void request(){
if(realSubject == null)
{
realSubject = new RealSubject();
}
realSubject.request();
}
}
- 客户端代码:可以看出Proxy代理类完成了RealSubject的工作
public class test {
public static void main(String []args){
Proxy proxy = new Proxy();
proxy.request();
}
}
代理模式应用场景
- 远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
(当打开一个很大的HTML网页时,先看到文字,图片一张一张下载,未打开的图片框就是通过虚拟代理来代替了真实的图片,此时代理模式存储了真实图片的路径和尺寸——浏览器是通过代理模式来优化下载) - 安全代理:用来控制真实对象访问时的权限。
- 智能索引:当调用真实的对象时,代理处理另外一些事。