导读:话说,当年学习了大话设计模式,后来又学习了head first,脑袋里能画出UML图,能写出代码的,不多。以致于到前一段时间,我还不能背着写出很常用的单例模式的代码!但是,本宝宝从很久以前开始面试的时候,就敢往简历上写熟悉设计模式,比如:。。。。。。。。果然,我还是个宝宝!本篇博客主要是总结一下,我知识储备以外的关于代理模式的运用,主要是提升系统的反应效率!
一、代理模式的设计意图
(主要摘抄于大话设计模式,有熟悉的,见笑之余,请果断忽略)
1.1,使用代理类处理远程方法调用的技术细节
远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实
1.2,延迟加载
虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象
1.3,屏蔽客户端直接访问真实对象
安全代理,用来控制真实对象访问时的权限
1.4,智能指引
当调用真实的对象是,代理处理另外一些事(个人感觉,这个和处理远程方法调用的技术细节很近。不过,按照书上的例子,假如说要计算实际对象的引用次数,那么这个时候就用代理类)
备注:当时看书的时候,对这几个用途没有很好地理解,后来学习了也使用了JDK和CGLib代理,稍微熟了点,然后补了一些理论知识,因为做项目的原因,结合到实践,才慢慢的有了些许的真正的熟悉,接下来主要介绍的是使用代理进行延迟加载!
二、代码对比
我先说一下,我当年为什么没懂代理:第一,实战经验不足;第二,理论不扎实;第三,这有点考我智商的代码
2.1,我自己错误的写法
public interface IDBQuery{
String Request();
}
public class DBQuery implements IDBQuery{
@Override
public String Request(){
return "request String"
}
}
public class DBQueryProxy implements IDBQuery{
private DBQuery real=null;
@Override
public String Request(){
real =new DBQuery();
return real.Request();
}
}
public class Main{
public static void main(String args[]){
IDBQuery q=new DBQueryProxy();
q.Request();
}
}
备注:我之前一直都不理解,这样多弄出一个类来,到底好在哪儿了,还不如直接调用真实的实现类,唉。。。。。。。。2.2,延迟加载的写法(只展示关键部分)
public class DBQueryProxy implements IDBQuery{
private DBQuery real=null;
@Override
public String Request(){
if(real==null){
real =new DBQuery();
}
return real.Request();
}
}
我一直都忽略了或者没有重视这个real==null的判断,我也是够够的了。话说,加上这个判断,就能在真正用到的时候,才创建真实的对象,可以有效地提升系统的启动速度,对改善用户体验有很大的帮助三、总结
1,首先,我感觉这个延迟加载的作用,是代理模式其他用途的一个基点
2,因为刚刚总结了单例模式,我就在想,创建真实对象的时候,可不可以使用单例的思想,永远只允许有一个真实的对象。因为如果按照现有的代码,如果是多个线程同时访问的话,除了会创建多个代理类,也势必会创建多个真实的对象。事实上,我们需要的是多个代理,而不是多个真实类,对不对??????
下篇博客,写代码做一下这个实现,好吧,其实我只是想用一下CountDownLatch这个玩意儿模拟并发而已。。。。。。