代理模式-延迟加载场景
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());
}
}
假设某客户端软件,根据用户请求,去数据库查询数据的功能。在数据库查询前需要获得数据库连接。在系统启动时,初始化系统所有的类,此时尝试获得数据库连接。当系统存在大量类似的操作时(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());
}
}
相关文章推荐
- C# 设计模式系列教程-代理模式
- 学习JavaScript设计模式之代理模式
- Python设计模式之代理模式实例
- java设计优化之代理模式
- C++设计模式编程中proxy代理模式的使用实例
- PHP设计模式之代理模式的深入解析
- JavaScript设计模式之代理模式介绍
- 学习JavaScript设计模式(代理模式)
- 深入理解JavaScript系列(31):设计模式之代理模式详解
- Java使用设计模式中的代理模式构建项目的实例展示
- Java设计模式之代理模式(Proxy模式)介绍
- 详解设计模式中的proxy代理模式及在Java程序中的实现
- 详解java动态代理模式
- JavaScript的设计模式经典之代理模式
- 探索JAVA动态代理机制
- 代理模式
- java设计模式——代理模式
- 代理/动态代理(Proxy)模式
- 代理模式