什么是代理模式?使用代理对象完成用户请求,屏蔽用户对真实对象的访问 代理模式的应用? 1、因为安全原因,屏蔽客户端直接访问真实对象 2、远程调用中,需要代理类处理远程调
什么是代理模式?使用代理对象完成用户请求,屏蔽用户对真实对象的访问
代理模式的应用?
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(); } }