【设计模式 5】那些年我还不懂代理模式

本文通过对比错误写法与正确实现,介绍了代理模式中的延迟加载技术。延迟加载能够有效提高系统启动速度,改善用户体验。文章还探讨了如何利用单例模式优化真实对象的创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值