什么是代理模式?使用代理对象完成用户请求,屏蔽用户对真实对象的访问
代理模式的应用?
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();
}
}