使用代理对象完成用户请求,避免用户直接访问真实对象。假设客户端软件有需要查询数据库的功能,但是在打开该软件,需要初始化所有类,在不使用的时候不需要加载连接数据库的类,或者其他的类,但是初始化类使得系统变得缓慢,所以当系统启用时先出实话代理类,代理类什么都不做,当需要连接数据库的时候再进行连接,可以加快系统启动时间,减少用户等待时间。
两个特点:
1·安全:屏蔽用户直接对真实对象的访问。
2·提升系统性能:对真实对象进行封装,达到延时加载目的。
代理模式的实现和使用:
//主题接口类
public interface IDBQuery{
String request();
}
//创建真实类
public class DBQuery implements IDBQuery{
public DBQuery(){
try{
Thread.sleep(1000);
//此处可能有连接数据库等耗时操作
}catch (InterruptedException e){
e.printStackTrace();
}
}
public String request(){
return "request String";
}
}
//代理类
public calss DBQueryProxy implements IDBQuery{
private DBQuery real = null;
public String request(){
if (real == null) {
real = new DBQuery();
}
return real.request();
}
}
//主类调用
public static void main(String[] args) {
IDBQuery q = new DBQueryProxy();
q.request();
}
由于动态代理类在程序运行时,通过反射机制动态生成,动态代理类通常代理接口下的所有类,动态代理事先不知道要代理的是什么,只有在运行的时候才能确定。