代理模式Proxy(静态代理)在程序运行前,代理类的.class文件就已经存在了

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://xxlcube.blog.csdn.net/article/details/8137574

我们在设计系统时,往往启动一个系统,发现非常慢,好一段时间,整个系统才启动完毕,这个过程中其实有很多都是在加载组件,也就是在加载你写的类


其实呢,我们并不需要在启动时,就加载这么多的类及其方法,比如数据库的查询,我们大可以不加载它,而是等到我们真正调用数据库查询时才去加载它


这其实就是延迟加载的思想:如果当前并没有使用这个组件,那么我们就不去加载这个组件,等到真正使用的时候,再加载这个组件,那么启动的时候呢,我们就用一个代理对象替代它的原有位置


比如一个接口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();
就是这条创建数据库连接的语句,别的就没用了。



代理模式就是为了延迟加载实现类的构造方法中的具体内容。

展开阅读全文

没有更多推荐了,返回首页