您的位置:首页 > 其它

代理模式-延迟加载场景

2016-06-06 17:03 363 查看
延迟加载的思想:如果当前没有使用这个组件时,则不需要真正地去初始化它,而是用一个代理对象去替代它的原有位置。当真正需要使用的时候,才对它进行加载。使用代理模式实现延迟加载是很有意义的,首先从时间轴上分散系统的压力,尤其在系统启动时,不必完成所有的初始化工作,从而加速启动时间;其次,对于很多真事主题而言,在软件启动到系统关闭的整个过程,可能都不会被调用,初始化这些数据无疑是一种资源的浪费。

假设某客户端软件,根据用户请求,去数据库查询数据的功能。在数据库查询前需要获得数据库连接。在系统启动时,初始化系统所有的类,此时尝试获得数据库连接。当系统存在大量类似的操作时(XML解析等),所有这些初始化操作都必须叠加,使得系统很慢。为此,使用代理模式,使用代理类,封装对数据库的查询操作。当系统启动时,初始化这个代理类,而非真实的数据库查询类,而代理类什么都不做。当真正开始查询的时候,才初始化查询对象。

1、声明一个接口,该接口含一个查询请求操作方法

package cn.com.proxy;
/**
* @author water
* @version 创建时间:2016年6月6日 下午4:01:37
* 代理类和被代理对象需要实现的接口
*/
public interface IDBQuery {

String request();
}


2、声明一个主题类,主题类是需要真正实现操作的类。该类实现1中声明的接口,在这个接口中,我们没有实现数据库的连接等初始化操作,而是让线程睡眠5秒,来模拟化数据库的连接等操作。
package cn.com.proxy;
/**
* @author water
* @version 创建时间:2016年6月6日 下午4:02:59
* 被代理对象
*/
public class DBQuery implements IDBQuery {

/**
* 在这里我们让请求方法睡眠5秒
*/
@Override
public String request() {
// TODO Auto-generated method stub
try{
Thread.sleep(5000);
}catch(Exception e){
e.printStackTrace();
}
return "OK";
}

}


3、代理类,代理类也实现1中定义的方法,同时包含一个代理对象。
package cn.com.proxy;
/**
* @author water
* @version 创建时间:2016年6月6日 下午4:04:54
* 代理类
*/
public class DBQueryProxy implements IDBQuery {

/**
* 被代理对象
*/
private IDBQuery dBQuery;
@Override
public String request() {
//如果被代理对象为空时,则初始化
if(dBQuery == null){
dBQuery = new DBQuery();
}
//真正调用目标对象的请求方法
return dBQuery.request();
}

}


4、测试类,
package cn.com.proxy;
/**
* @author water
* @version 创建时间:2016年6月6日 下午4:07:10
* 类说明
*/
public class TestProxy {

public static void main(String[] args) {
// TODO Auto-generated method stub
//声明一个代理对象,初始化代理类对象时,被代理对象的查询方法并非真正执行
IDBQuery proxy = new DBQueryProxy();
//调用代理对象的请求方法,当调用代理类请求方法时,被代理对象才被真正实例化。
System.out.println(proxy.request());

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  代理模式