代理模式是对象的结构模式。
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
代理模式的英文叫做Proxy或 Surrogate,中文都可翻译为 代理。
所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。
在一些情况下,一个客户不想或者不能直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理的种类:
如果按照使用目的划分,
代理模式涉及的角色:
示意性源码:
抽象主题角色
public abstract class Subject {
/**
* 声明一个抽象的请求方法
*/
abstract public void request();
}
真实主题角色
public class RealSubject extends Subject {
/**
* 构造函数
*/
public RealSubject(){
}
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("From real subject");
}
}
代理主题角色
public class ProxySubject extends Subject {
private RealSubject realSubject;
public ProxySubject(){}
@Override
public void request() {
preRequest();
if(realSubject == null){
realSubject = new RealSubject();
}
realSubject.request();
postRequest();
}
/**
* 请求前的操作
*/
private void preRequest(){
// something you want to do before requesting
}
/**
* 请求后的操作
*/
private void postRequest(){
// something you want to do after requesting
}
}
客户端调用
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Subject subject = new ProxySubject();
subject.request();
}
}
根据代理种类的不同,代理模式有不同的特点。
远程代理
优点是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。
由于客户可能没有意识到会启动一个耗费时间的远程调用,因此客户没有必要的思想准备。
虚拟代理
优点是代理对象可以在必要的时候才被代理的对象加载。代理可以对加载过程加以必要的优化。当一个模块的加载十分耗费资源的时候,虚拟代理的优点就非常明显。
例如:加载图片时,会在加载的过程显示正在加载中,而加载完成后,则替换成目标图片。
保护代理
优点是它可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理对象。
智能引用代理
在访问一个对象时,可以执行一些内务处理操作,比如计数操作等。