导读:话说,当年学习了大话设计模式,后来又学习了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这个玩意儿模拟并发而已。。。。。。

posted on 2017-01-15 20:45  何红霞  阅读(196)  评论(0编辑  收藏  举报