我们在设计系统时,往往启动一个系统,发现非常慢,好一段时间,整个系统才启动完毕,这个过程中其实有很多都是在加载组件,也就是在加载你写的类
其实呢,我们并不需要在启动时,就加载这么多的类及其方法,比如数据库的查询,我们大可以不加载它,而是等到我们真正调用数据库查询时才去加载它
这其实就是延迟加载的思想:如果当前并没有使用这个组件,那么我们就不去加载这个组件,等到真正使用的时候,再加载这个组件,那么启动的时候呢,我们就用一个代理对象替代它的原有位置
比如一个接口D,然后一个接口实现类DI,有可能在DI中的构造方法中,有数据库连接的语句,那么这个就是个要害呢,如果不用代理模式,启动的时候肯定会加载这个连接了,但是我们不需要啊,我们就可以用代理了
新建一个代理类DP,也是实现了D,但是呢,没有构造方法了,里面有一个DI的对象,初始化NULL,但是在方法中呢(这个方法就是借口D中的方法,被后续实现类重写),我们就可以判断了,因为这个方法中肯定会用到构造方法中的内容,不然也没有必要在构造方法中初始化一些东西了,如果DI对象是空的话,我们就初始化一个实例对象出来,然后用这个对象调用重写的那个方法即可,这里其实本质就是通过DI的一个对象调用DI中重写的那个方法了。
这里就是避免了启动时加载DI这个类,实例化对象,其实就这么简单。
public interface QueryDAO {
public void query();
}
public class QueryDAOImpl implements QueryDAO {
private Connection con = null;
public QueryDAOImpl() {
con = Util.getCon();
}
@Override
public void query() {
// TODO Auto-generated method stub
String sql = "SELECT sitename FROM xxrpth.XXHGS_SITEINFO";
ResultSet rs = null;
String str = "";
try {
rs = con.createStatement().executeQuery(sql);
if(rs.next()) {
str = rs.getString(1);
}
System.out.println("str="+str);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class QueryProxy implements QueryDAO {
private QueryDAOImpl qdi = null;
@Override
public void query() {
// TODO Auto-generated method stub
if(qdi==null) {
qdi = new QueryDAOImpl();
}
qdi.query();
}
}
从代码中我们可以看出,这里的代理类就是帮忙延迟加载了
con = Util.getCon();
就是这条创建数据库连接的语句,别的就没用了。
代理模式就是为了延迟加载实现类的构造方法中的具体内容。