代理模式()
代理模式也是一种很常见的设计模式它使用代理对象完成用户请求屏蔽用户对真实对象的访问就如同现实中的代理一样代理人被授权执行当事人的一些事宜而无需当事人出面从第三方的角度看似乎当事人并不存在因为他只和代理人通信而事实上代理人是要有当事人的授权并且在核心问题上还需要请示当事人
在现实中使用代理的情况很普遍而且原因也很多比如当事人因为某些隐私不方便出面或者当事人不具备某些相关的专业技能而需要一个职业人员来完成一些专业的操作也可能由于当事人没有时间处理事务而聘用代理人出面
在软件设计中使用代理模式的意图也很多比如因为安全原因需要屏蔽客户端直接访问真实对象或者在远程调用中需要使用代理类处理远程方法调用的技术细节(如RMI)也可能是为了提升系统性能对真实对象进行封装从而达到延迟加载的目的在本小节中主要讨论使用代理模式实现延迟加载从而提升系统的性能和反应速度
代理模式的结构
代理模式的主要参与者有个如表所示
表 代理模式角色
以一个简单的示例来阐述使用代理模式实现延迟加载的方法及其意义假设某客户端软件有根据用户请求去数据库查询数据的功能在查询数据前需要获得数据库连接软件开启时初始化系统的所有类此时尝试获得数据库连接当系统有大量的类似操作存在时(比如xml解析等)所有这些初始化操作的叠加会使得系统的启动速度变得非常缓慢为此使用代理模式使用代理类封装对数据库查询中的初始化操作当系统启动时初始化这个代理类而非真实的数据库查询类而代理类什么都没有做因此它的构造是相当迅速的
在系统启动时将消耗资源最多的方法都使用代理模式分离就可以加快系统的启动速度减少用户的等待时间而在用户真正做查询操作时再由代理类单独去加载真实的数据库查询类完成用户的请求这个过程就是使用代理模式实现了延迟加载
注意代理模式可以用于多种场合如用于远程调用的网络代理考虑安全因素的安全代理等延迟加载只是代理模式的一种应用场景
延迟加载的核心思想是如果当前并没有使用这个组件则不需要真正地初始化它使用一个代理对象替代它的原有的位置只要在真正需要使用的时候才对它进行加载使用代理模式的延迟加载是非常有意义的首先它可以在时间轴上分散系统压力尤其在系统启动时不必完成所有的初始化工作从而加速启动时间其次对很多真实主题而言在软件启动直到被关闭的整个过程中可能根本不会被调用初始化这些数据无疑是一种资源浪费图显示了使用代理类封装数据库查询类后系统的启动过程
图 代理类的工作流程
若系统不使用代理模式则在启动时就要初始化DBQuery对象而使用代理模式后启动时只需要初始化一个轻量级的对象DBQueryProxy
系统的结构图如图所示IDBQuery是主题接口定义代理类和真实类需要对外提供的服务在本例中了定义了实现数据库查询的公共方法request()函数DBQuery是真实主题负责实际的业务操作DBQueryProxy是DBQuery的代理类
返回目录Java程序性能优化让你的Java程序更快更稳定
编辑推荐
Java程序设计培训视频教程
JEE高级框架实战培训视频教程
JME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLEG数据库开发优化指南