java 程序性能优化《第二章》设计优化 2.1善用设计模式 2 代理模式
代理模式也是一种很常见的设计模式。它使用代理对象完成用户请求,屏蔽用户对真实对象的访问。就如同现实中的代理一样,代理人被授权执行当事人的一些适宜,而无需当事人出面,从第三方的角度看,似乎当事人并不存在,因为他只和代理人通信。而事实上,代理人是要有当事人的授权,并且在核心问题上还需要请示当事人。
在现实中,使用代理的情况很普遍,而且原因也很多。比如,当事人因为某些隐私不方便出面,或者当事人不具备某些相关的专业技能,而需要一个职业人员来完成一些专业的操作,也可能由于当事人没有时间处理事务,而聘用代理人出面。
在软件设计中,使用代理模式的意图也很多,比如因为安全问题,需要屏蔽客户端直接访问真实对象;或者在远程调用中,需要使用代理类处理远程方法调用的技术细节(如 RMI );也可能是为了提升系统性能,对真实对象进行封装,从而达到延迟加载的目的。在本节中,主要讨论使用代理模式实现延迟加载,从而提升系统的性能和反应速度。
1.代理模式的结构
代理模式的主要参与者有4个,如表2.1所示。
表2.1 代理模式角色
角色 | 作用 |
主题接口 | 定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法 |
真实主题 | 真正实现业务逻辑的类 |
代理类 | 用来代理和封装真实主题 |
Main | 客户端,使用代理类和主题接口完成一些工作 |
以一个简单的例子来阐述使用代理模式实现延迟加载的方法及其意义。假设客户端软件,有根据用户请求,去数据库查询数据的功能。在查询数据前,当系统有大量的类似操作存在时(比如xml解析等) ,所有这些初始化操作的叠加,会使得系统的启动速度变得非常缓慢。为此,使用代理模式,使用代理类,封装对数据库查询中的初始化操作,当系统启动时,初始化这个代理类,而非真实地数据库查询类,而代理类什么都没有做,因此,它的构造是相当迅速的。
在系统启动时,将消耗资源最多的方法都使用代理模式分离,就可以加快系统的启动速度,减少用户的等待时间。而在用户真正做查询操作时,再有代理类,单独去加载真实的数据库查询类,完成用户的请求。这个过程就是使用代理模式实现了延迟加载。
PS:代理模式可以用于多种场合,如果用于远程调用的网络代理、考虑安全因素的安全代理等,延迟加载只是代理模式的一种应用场景。
延迟加载的核心思想是:如果当前并没有使用这个组件,则不需要真正地初始化它,使用一个代理对象替代它原有的位置,只要在真正需要使用的时候,才对它进行加载。使用代理模式的延迟加载时非常有意义的,首先,它可以在时间轴上分散系统压力,尤其在系统启动时,不必完成所有的初始化工作,从而加速启动时间;其次,对很多真实主题而言,在软件启动直到被关闭的整个过程中,可能根本不会被调用,初始化这些数据无疑是一种资源浪费。图2.2显示了使用代理类封装数据库查询类后,系统的启动过程。
未完。待续!