mac_girl

使用代理模式解决延迟加载问题

什么是代理模式?使用代理对象完成用户请求,屏蔽用户对真实对象的访问

代理模式的应用?

1、因为安全原因,屏蔽客户端直接访问真实对象

2、远程调用中,需要代理类处理远程调用的技术细节

3.使用代理类实现延迟加载,从而提升系统的性能和反应速度

构建代理模式:

1.主题接口,真实类和代理类的公共接口

2.代理类,实现主体接口,代理封装真实类的调用

3.真实类,实现主题接口,接口的具体逻辑实现

4.客户端,使用代理类调用主题接口实现所需功能

使用代理模式解决延迟加载问题

/**
* 使用代理的原因:系统启动时尽可能的少初始化
* ---:一般情况下,系统一启动就要加载所有的类,但是有一些类初始化的时间长,在系统启动时也没有使用它,这就导致了项目的启动缓慢
*
* 为了解决这一问题:
* -- :使用代理模式
* 在项目初始化时,初始化代理类,使用代理类代替原有类的位置,在真正使用时才将代理类加载入内存,进行初始化
*
* 如何构建代理模式?
* --- :1、 定义一个接口,将消耗资源最多的方法抽取出来,封装成代理类和真实类的公共接口
* 2、 真实类实现这个接口,并定方法的具体义体现,实现方法的真实逻辑
* 3、代理类也实现这个接口,实现公共接口的方法,在方法中封装了真实对象的操作
*/

主题接口类:

/**
* 模拟数据库的查询,代理类和真实类公共的主体接口
/
public interface DBQueryInteface {
/
*
将消耗资源最多的方法抽取出来
---: 处理用户的查询请求
*/
public String request();
}

真实类:

/**
* 真实的数据库查询类:
* 需要进行数据库连接及语句查询工作。是一个重量级对象
/
public class DBQuery implements DBQueryInteface {
/
*
* 该类是一个重量级对象,在使用时需要进行数据库连接操作
* ---:模拟数据库连接的时耗
*/
public DBQuery(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

/**
* 定义了该类方法功能的真实操作
* @return
*/
@Override
public String request(){
return "request string";
}
}

代理类:

/**
* 数据库查询代理类
/
public class DBProxyQuery implements DBQueryInteface {
/
*
* 轻量级对象,DBQuery在使用时才加载
*/
DBQuery dbQuery = null;

/**
* 与真实类实现同一个接口和同一个抽象方法,在抽象方法中创建真实类,调用真实类的方法实现逻辑
*/
@Override
public String request() {
if(dbQuery == null) {
dbQuery = new DBQuery();
}
return dbQuery.request();
}
}

客户端调用类:

/**
* 使用代理的原因:系统启动时尽可能的少初始化
* ---:一般情况下,系统一启动就要加载所有的类,但是有一些类初始化的时间长,在系统启动时也没有使用它,这就导致了项目的启动缓慢
*
* 为了解决这一问题:
* -- :使用代理模式
* 在项目初始化时,初始化代理类,使用代理类代替原有类的位置,在真正使用时才将代理类加载入内存,进行初始化
*
* 如何构建代理模式?
* --- :1、 定义一个接口,将消耗资源最多的方法抽取出来,封装成代理类和真实类的公共接口
* 2、 真实类实现这个接口,并定方法的具体义体现,实现方法的真实逻辑
* 3、代理类也实现这个接口,实现公共接口的方法,在方法中封装了真实对象的操作
/
public class Client {
public static void main(String[] args) {
/
*
系统一启动,先加载代理类,使用代理类代替真实类的原有位置
*/
DBQueryInteface dbQueryInteface = new DBProxyQuery(); //该类为轻量级对象,加载速度快

/**
* 当使用到该类的功能时才加载真实类
*/
dbQueryInteface.request();
}
}

posted on 2019-09-19 19:34  宇宙美少女  阅读(543)  评论(0)    收藏  举报

导航