上一篇:浅议Java设计模式的中介者模式 >>
Java设计模式之虚拟代理模式
| 天极软件专题专区精选 到天极软件“读编交流区”畅所欲言 | |||
| Google专区 | POPO专区 | QQ专区 QQ挂机 | 了解Web2.0 |
| Flash MX 视频教程 | Photoshop视频教程 | 网页设计视频教程 | 照片处理数字暗房 |
| PPT动画演示教程 | Excel动画教程集 | Word动画演示教程 | Windows Vista专区 |
| 特洛伊木马专区 | 黑客知识教程专区 | 防火墙应用专区 | 注册表应用专区 |
| Windows API开发专区 | 网络编程专区 | VB数据库编程专区 | 图像处理与多媒体编程 |
虚拟代理模式(Virtual Proxy)是一种节省内存的技术,它建议创建那些占用大量内存或处理复杂的对象时,把创建这类对象推迟到使用它的时候。在特定的应用中,不同部分的功能由不同的对象组成,应用启动的时候,不会立即使用所有的对象。在这种情况下,虚拟代理模式建议推迟对象的创建直到应用程序需要它为止。对象被应用第一次引用时创建并且同一个实例可以被重用。这种方法优缺点并存。
优点:
这种方法的优点是,在应用程序启动时,由于不需要创建和装载所有的对象,因此加速了应用程序的启动。
缺点:
因为不能保证特定的应用程序对象被创建,在访问这个对象的任何地方,都需要检测确认它不是空(null)。也就是,这种检测的时间消耗是最大的缺点。
应用虚拟代理模式,需要设计一个与真实对象具有相同接口的单独对象(指虚拟代理)。不同的客户对象可以在创建和使用真实对象地方用相应的虚拟对象来代替。虚拟对象把真实对象的引用作为它的实例变量维护。代理对象不要自动创建真实对象,当客户需要真实对象的服务时,调用虚拟代理对象上的方法,并且检测真实对象是否被创建。
如果真实对象已经创建,代理把调用转发给真实对象,如果真实对象没有被创建:
1) 代理对象创建真实对象
2) 代理对象把这个对象分配给引用变量。
3) 代理把调用转发给真实对象
按照这种安排,验证对象存在和转发方法调用这些细节对于客户是不可见的。客户对象就像和真实对象一样与代理对象进行交互。因此客户从检测真实对象是否为null中解脱出来,另外,由于创建代理对象在时间和处理复杂度上要少于创建真实对象。因此,在应用程序启动的时候,用代理对象代替真实对象初始化。
例子:
假设我们建立一个JAVA程序的集成开发环境(Integrated Development Environment),这个环境包括三个功能:编译、运行、生成JavaDoc文档。在新建和编辑Java程序时,最为常用的是编译和运行。至于生成JavaDoc文档对于每一个Java程序不是必需的。因此,在Java开发环境启动时,不要创建和装载实现集成开发环境全部功能的所有对象,仅创建那些在编辑、编译、运行时用到的对象,保留提供生成JavaDoc文档的对象,这是一个好的设计思想。这种对象创建策略能够高效地利用内存空间并且加快了集成开发环境的启动速度。
假设编译、运行、生成JavaDoc文档这些功能分别由三个工具类提供??Compiler、Runtime和JavaDoc。客户对象可以访问的不同IDE操作的接口以抽象类IDEOperation的形式定义。
| public abstract class IDEOperation { private Compiler cmp; private Runtime rtime; public void compile(String javaFile) { cmp.compile(javaFile); } public void run(String classFile) { rtime.run (classFile); } //to be delayed until needed. public abstract void generateDocs(String javaFile); public IDEOperation() { cmp = new Compiler(); rtime = new Runtime(); } } |
类IDEOperation提供了编译、运行java程序方法的实现,作为它构造函数的一部分,IDEOperation创建和装载了进行编译和执行操作的Compiler和Runtime对象。生成JavaDoc文档的方法generateDocs方法被设计成抽象的方法,由它的子类来实现。
让我们定义抽象类IDEOperation的一个具体子类RealProcessor。作为RealProcessor构造函数的一部分,创建JavaDoc对象来提供生成JavaDoc文档的服务,通过使用JavaDoc对象功能实现generateDocs方法。
| public class RealProcessor extends IDEOperation { JavaDoc jdoc; public RealProcessor() { super(); jdoc = new JavaDoc(); } public void generateDocs(String javaFile) { jdoc.generateDocs(javaFile); } } |
通过上面的实现,RealProcessor类包含了编译、运行和生成JavaDoc文档的所有功能。像我们原来讨论的,生成JavaDoc文档的功能不是每一个Java程序所必须的,当RealProcessor实例化的时候,包括负责生成JavaDoc文档的JavaDoc对象的一系列对象被创建。推迟创建JavaDoc对象有以下优点:
1) 加速了RealProcessor对象的创建时间,因为它的构造函数创建的很少的对象。
2) 高效地利用内存,因为在不需要对象服务的时候,不需要把对象保持在内存中。
在不改变RealProcessor实现的前提下,可以通过定义IDEOperation的另外一个子类ProxyProcessor来实现虚拟代理。因为RealProcessor和ProxyProcessor共享相同的接口,客户对象可以用ProxyProcessor代替RealProcessor。图25.1展示了类层次;
|
Figure 25.1: IDEOperation Class Hierarchy |
| public class ProxyProcessor extends IDEOperation { private RealProcessor realProcessor; public void generateDocs(String javaFile) { /* In order to generate javadocs the proxy loads the actual object and invokes its methods. */ if (realProcessor == null) { realProcessor = new RealProcessor(); } realProcessor.generateDocs(javaFile); } } |
作为自己的实例变量,ProxyProcessor维护了RealProcessor对象的一个引用。作为generateDocs方法的一部分,ProxyProcessor检测引用变量是否被初始化为RealProcessor对象。如果没有被初始化,它创建一个RealProcessor对象并把这个对象分配给它的实例变量。一旦RealProcessor对象已经被创建,就调用其上的generateDocs方法。
实际上,也就是当客户对象第一次请求产生javadoc文档时,RealProcessor才被初始化装入内存中。反过来,直到客户需要为Java程序生成javadocs时,JavaDoc对象才会被创建和装入内存中。
客户对象像调用真实处理对象一样调用ProxyProcessor上的方法,并不需要关心(知道)RealProcessor对象是否存在。 至于验证、检测和ProxyProcessor和RealProcessor之间的交互、这样的细节对于客户对象是透明的。
| public class Client { public static void main(String[] args) { /* At this point objects required for the compile and run operations are created, but not the objects that provide the generate Javadoc functionality. */ IDEOperation IDE = new ProxyProcessor(); IDE.compile("test.java"); IDE.run("test.class"); /* The Javadoc functionality is accessed For the first time and hence the Object offering the Javadoc generation Functionality is loaded at this point. */ IDE.generateDocs("test.java"); } } |
|
编辑推荐:《Java与模式》作者阎宏专区 |
下一篇:深入浅出Java设计模式之迭代器模式 >>
相关文章:
- · ASP.NET 2.0 中的创建母版页
- · ASP.NET 2.0中轻松实现网站换肤
- · 剖析ASP.NET2.0站点导航功能之建立导航
- · C#+ASP.NET 2.0定制复合组件之基础篇
- · 学用powerpoint快捷键 避免鼠标操作失误
- · ASP.NET 2.0服务器控件之实现验证控件
- · powerpoint中实现滚动字幕效果
- · powerpoint制作自动交互问答课件
- · ASP.NET 2.0服务器控件之复合控件事件
- · ASP.NET2.0服务器控件之创建复杂属性
- · ASP.NET 2.0服务器控件开发之简单属性
- · PHP 5.0对象模型深度探索之起步
- · PHP 5.0对象模型深度探索之构造和析构
- · PHP 5.0对象模型深度探索之类的静态成员
- · PHP 5.0对象模型深度探索之绑定
- · PHP5.0对象模型探索之抽象方法和抽象类
- · PHP5.0对象模型探索之重载
- · PHP5.0对象模型探索之对象串行化
- · PHP5.0对象模型探索之其它特性
- · J2ME平台手机游戏移植的体会
- · 基于J2ME平台发送图片到Servlet
- · J2ME编程最佳实践之灵活的RMS应用
- · 使用J2ME技术实现简单的动画
- · Visual C++程序调试方法入门
- · Visual C++及C++中的智能指针应用分析
- · Visual C++中回调函数使用的变身大法
- · 用Visual C++创建自定义的应用程序向导
- · 用VC纯资源DLL解决国际化问题
- · 教你查看传说中的wps2005彩蛋
- · 用金山wps实现首字下沉效果
- · 金山wps各版本启动界面全记录
- · 在wps office中实现表格文字竖排
- · wps office文档双面打印边距设置方法
- · VC程序中树型控件节点拖动的完美实现
- · VC中用DAO实现树型控件的数据库访问
- · VC实现类似Windows的颜色选择器
- · 用VC++制作播放AVI视频流的动画按钮
- · Visual C++中轻松实现透明滑动控件
