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

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

代理模式的应用?

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();
    }
}
金麟岂能忍一世平凡 飞上了青天 天下还依然
原文地址:https://www.cnblogs.com/Auge/p/11552065.html