代理模式是一种非常常用的设计模式,典型的比如,springAOP实现,hibernate的延迟加载.它的基本思想是:创建代理对象完成用户请求,屏蔽用户对真实对象的访问.这样一个很明显的意图是安全性的考虑.还有些场景比如:提高性能,将真实对象进行封装,从而达到延迟加载的目的. 下面我们通过一个事例来看看它是怎么来达到延迟加载,从而提高系统性能.
延迟加载的核心思想是;如果当前没有使用这个组件,我们就不需要去立即加载初始化它.而是等到需要的时候才真正的区加载.比如典型的查询功能.在查询时我们需要获得连接,在软件开启的时候,需要初始化很多的类,或得连接,这样的操作多了,会使得系统的速度变得缓慢.因此我们可以设计代理类,封装对数据查询的初始化操作,当系统启动时,初始化这个代理类,而非真实的数据库查询类,而代理类什么都没做,所以它的构造是相当迅速的.
类设计如下:
其中DBQuery'是被代理的类,DBQueryProxy是代理类,它们通过IDBQuery接口进行规范.具体代码设计如下:
IDBQuery:
package design;
public interface IDBQuery {
public String request();
}
DBQuery:
package design;
public class DBQuery implements IDBQuery{
public DBQuery() {
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public String request() {
// TODO Auto-generated method stub
System.out.println("数据查询操作");
return "real";
}
}
DBQueryProxy:
package design;
public class DBQueryProxy implements IDBQuery{
private DBQuery dbQuery;
public DBQueryProxy() {
System.out.println("代理初始");
}
@Override
public String request() {
// TODO Auto-generated method stub
if (dbQuery==null) {
dbQuery=new DBQuery(); //需要时才去创建,
}
return dbQuery.request();
}
}
测试DBQueryMain:
package design;
public class DBQueryMain {
public static void main(String[] args) {
DBQueryProxy dbQuery=new DBQueryProxy();
dbQuery.request();
}
}
打印:
代理初始
数据查询操作