Java程序性能优化 读书笔记(三)设计模式:代理模式

来源:互联网 发布:carousel.js 使用手册 编辑:程序博客网 时间:2024/05/21 19:33

一、代理模式

代理模式也是一种很常见的设计模式。它使用代理对象完成用户请求,屏蔽用户对真实对象的访问在现实中,使用代理的情况很普遍,而且原因也很多。比如,当事人因为某些隐私不方便出面,或者当事人不具备某些相关的专业技能,而需要一个职业人员来完成一些专业的操作,也可能由于当事人没有时间处理事务,而聘用代理人出面。
就如同现实中的代理一样,代理人被授权执行当事人的一些适宜,而无需当事人出面,从第三方的角度看,似乎当事人并不存在,因为他只和代理人通信。而事实上,代理人是要有当事人的授权,并且在核心问题上还需要请示当事人。
在软件设计中,使用代理模式的意图也很多:
1. 因为安全问题,需要屏蔽客户端直接访问真实对象
2. 在远程调用中,需要使用代理类处理远程方法调用的技术细节(如 RMI );
3. 也可能是为了提升系统性能,对真实对象进行封装,从而达到延迟加载的目的。
在本节中,主要讨论使用代理模式实现延迟加载,从而提升系统的性能和反应速度。

二、延迟加载

延迟加载的核心思想是:如果当前并没有使用这个组件,则不需要真正地初始化它,使用一个代理对象替代它原有的位置,只要在真正需要使用的时候,才对它进行加载。使用代理模式的延迟加载时非常有意义的:
1. 它可以在时间轴上分散系统压力,尤其在系统启动时,不必完成所有的初始化工作,从而加速启动时间;
2. 对很多真实主体而言,在软件启动直到被关闭的整个过程中,可能根本不会被调用,初始化这些数据无疑是一种资源浪费。

以一个简单的例子来阐述使用代理模式实现延迟加载的方法及其意义。假设客户端软件,有根据用户请求去数据库查询数据的功能。在查询数据前,当系统有大量的类似操作存在时(比如xml解析等) ,所有这些初始化操作的叠加,会使得系统的启动速度变得非常缓慢。为此,使用代理模式,使用代理类,封装对数据库查询中的初始化操作,当系统启动时,初始化这个代理类,而非真实地数据库查询类,而代理类什么都没有做,因此,它的构造是相当迅速的。
在系统启动时,将消耗资源最多的方法都使用代理模式分离,就可以加快系统的启动速度,减少用户的等待时间。而在用户真正做查询操作时,再有代理类,单独去加载真实的数据库查询类,完成用户的请求。这个过程就是使用代理模式实现了延迟加载。

三、代理的实现

以数据库的初始化为例,不采用代理模式时,系统启动时初始化重量级DBQuery对象,其定义了实现数据库查询的方法,负责业务操作,而采用代理模式后启动时仅初始化轻量级对象DBQueryProxy,该对象只实现了一个接口。代码如下:
public interface IDBQuery{String request();}
DBQuery的实现如下
public class DBQuery implements IDBQuery{public DBQuery(){try{Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}@Overridepublic String request(){return "request string";}} 
DBQueryProxy的实现如下
public class DBQueryProxy implements IDBQuery{private DBQuery real = null;@Overridepublic String request(){if (real == null) {real = new DBQuery();}return real.request();}}
主函数如下:
public class Main{public static void main(String[] args) {IDBQuery q = new DBQueryProxy();...q.request();//使用时调用}}
延时加载达到了优化启动时间的效果

四、动态代理

参见Java 编程思想(四)动态代理




阅读全文
0 0