好的设计是性能的关键,能带来程序“质”的优化,这里并不教大家各种设计模型,而是直接介绍代理模式在性能优化的优缺点
代理模式
对真实对象进行延迟加载,从而提高系统启动速度,有点类似360优化我们开机时间的感觉,同时还可以将常用的数据缓存起来,当下次再次访问,就直接中代理中获得
静态代理
分别有下面4个类:
- IDBQuery:代理的接口
- DBQuery:真实的类,这里模仿加载速度特别慢的类,为了加快系统启动时间,系统启动并不加载它
- DBQueryProxy:这个是代理类,系统启动的时候,就加载它
- Main:主程序,这里模拟“启动”和“调用”
public interface IDBQuery {
String request();
}
public class DBQuery implements IDBQuery{
public DBQuery(){
//可能包含数据库连接等耗时操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public String request() {
return "request string";
}
}
public class DBQueryProxy implements IDBQuery {
private DBQuery real=null;
@Override
public String request() {
//在真正需要的时候 ,才创建真实对象,创建过程可能很慢
if(real==null)
real=new DBQuery();
//在多线程环境下,这里返回一个虚假类,类似于Future模式
return real.request();
}
}
public class Main {
public static void main(String args[]){
IDBQuery q=new DBQueryProxy(); //使用代理
q.request(); //在真正使用时才创建真实对象
}
}
动态代理
使用字节码动态加载技术,在运行时生成并加载类,相对于静态代理,优点如下:
- 不需要写封装类,简介代码
- 如果接口有变化,真实类和封装类都要修改,不利于维护
- 在运行时,指定代理类的执行逻辑,从而提高系统的灵活性
- 主要的动态代理技术有,CGLIB、Javassist、ASM等多种
- Hibernate常用动态代理技术来延迟获取所有数据,而是当真正调用数据才进行查询操作