虚拟代理模式(Virtual Proxy)是
![](/icons/89684yi.gif)
种节省内存
![](/icons/89684de.gif)
技术
![](/icons/89684dou.gif)
它建议创建那些占用大量内存或处理复杂
![](/icons/89684de.gif)
对象时
![](/icons/89684dou.gif)
把创建这类对象推迟到使用它
![](/icons/89684de.gif)
时候
![](/icons/89684dou2.gif)
在特定
![](/icons/89684de.gif)
应用中
![](/icons/89684dou.gif)
区别部分
![](/icons/89684de.gif)
功能由区别
![](/icons/89684de.gif)
对象组成
![](/icons/89684dou.gif)
应用启动
![](/icons/89684de.gif)
时候
![](/icons/89684dou.gif)
不会立即使用所有
![](/icons/89684de.gif)
对象
![](/icons/89684dou2.gif)
在这种情况下
![](/icons/89684dou.gif)
虚拟代理模式建议推迟对象
![](/icons/89684de.gif)
创建直到应用
![](/icons/89684chengxu.gif)
需要它为止
![](/icons/89684dou2.gif)
对象被应用第
![](/icons/89684yi.gif)
次引用时创建并且同
![](/icons/89684yi.gif)
个例子可以被重用
![](/icons/89684dou2.gif)
这种思路方法优缺点并存
![](/icons/89684dou2.gif)
优点:
这种思路方法
![](/icons/89684de.gif)
优点是
![](/icons/89684dou.gif)
在应用
![](/icons/89684chengxu.gif)
启动时
![](/icons/89684dou.gif)
由于不需要创建和装载所有
![](/icons/89684de.gif)
对象
![](/icons/89684dou.gif)
因此加速了应用
![](/icons/89684chengxu.gif)
![](/icons/89684de.gif)
启动
![](/icons/89684dou2.gif)
缺点:
![](/icons/89684yinwei.gif)
不能保证特定
![](/icons/89684de.gif)
应用
![](/icons/89684chengxu.gif)
对象被创建
![](/icons/89684dou.gif)
在访问这个对象
![](/icons/89684de.gif)
任何地方
![](/icons/89684dou.gif)
都需要检测确认它不是空(null)
![](/icons/89684dou2.gif)
也就是
![](/icons/89684dou.gif)
这种检测
![](/icons/89684de.gif)
时间消耗是最大
![](/icons/89684de.gif)
缺点
![](/icons/89684dou2.gif)
应用虚拟代理模式
![](/icons/89684dou.gif)
需要设计
![](/icons/89684yi.gif)
个和真实对象具有相同接口
![](/icons/89684de.gif)
单独对象(指虚拟代理)
![](/icons/89684dou2.gif)
区别
![](/icons/89684de.gif)
客户对象可以在创建和使用真实对象地方用相应
![](/icons/89684de.gif)
虚拟对象来代替
![](/icons/89684dou2.gif)
虚拟对象把真实对象
![](/icons/89684de.gif)
引用作为它
![](/icons/89684de.gif)
例子变量维护
![](/icons/89684dou2.gif)
代理对象不要自动创建真实对象
![](/icons/89684dou.gif)
当客户需要真实对象
![](/icons/89684de.gif)
服务时
![](/icons/89684dou.gif)
![](/icons/89684diaoyong.gif)
虚拟代理对象上
![](/icons/89684de.gif)
思路方法
![](/icons/89684dou.gif)
并且检测真实对象是否被创建
![](/icons/89684dou2.gif)
如果真实对象已经创建
![](/icons/89684dou.gif)
代理把
![](/icons/89684diaoyong.gif)
转发给真实对象
![](/icons/89684dou.gif)
如果真实对象没有被创建:
1) 代理对象创建真实对象
2) 代理对象把这个对象分配给引用变量
![](/icons/89684dou2.gif)
3) 代理把
![](/icons/89684diaoyong.gif)
转发给真实对象
按照这种安排
![](/icons/89684dou.gif)
验证对象存在和转发思路方法
![](/icons/89684diaoyong.gif)
这些细节对于客户是不可见
![](/icons/89684de.gif)
![](/icons/89684dou2.gif)
客户对象就像和真实对象
![](/icons/89684yi.gif)
样和代理对象进行交互
![](/icons/89684dou2.gif)
因此客户从检测真实对象是否为null中解脱出来
![](/icons/89684dou.gif)
另外
![](/icons/89684dou.gif)
由于创建代理对象在时间和处理复杂度上要少于创建真实对象
![](/icons/89684dou2.gif)
因此
![](/icons/89684dou.gif)
在应用
![](/icons/89684chengxu.gif)
启动
![](/icons/89684de.gif)
时候
![](/icons/89684dou.gif)
用代理对象代替真实对象
![](/icons/89684chushi.gif)
化
![](/icons/89684dou2.gif)
例子:
假设我们建立
![](/icons/89684yi.gif)
个JAVA
![](/icons/89684chengxu.gif)
![](/icons/89684de.gif)
集成开发环境(Integrated Development Environment),这个环境包括 3个功能:编译、运行、生成JavaDoc文档
![](/icons/89684dou2.gif)
在新建和编辑Java
![](/icons/89684chengxu.gif)
时
![](/icons/89684dou.gif)
最为常用
![](/icons/89684de.gif)
是编译和运行
![](/icons/89684dou2.gif)
至于生成JavaDoc文档对于每
![](/icons/89684yi.gif)
个Java
![](/icons/89684chengxu.gif)
不是必需
![](/icons/89684de.gif)
![](/icons/89684dou2.gif)
因此
![](/icons/89684dou.gif)
在Java开发环境启动时
![](/icons/89684dou.gif)
不要创建和装载实现集成开发环境全部功能
![](/icons/89684de.gif)
所有对象
![](/icons/89684dou.gif)
仅创建那些在编辑、编译、运行时用到
![](/icons/89684de.gif)
对象
![](/icons/89684dou.gif)
保留提供生成JavaDoc文档
![](/icons/89684de.gif)
对象
![](/icons/89684dou.gif)
这是
![](/icons/89684yi.gif)
个好
![](/icons/89684de.gif)
设计思想
![](/icons/89684dou2.gif)
这种对象创建策略能够高效地利用内存空间并且加快了集成开发环境
![](/icons/89684de.gif)
启动速度
![](/icons/89684dou2.gif)
假设编译、运行、生成JavaDoc文档这些功能分别由 3个工具类提供??Compiler、Runtime和JavaDoc
![](/icons/89684dou2.gif)
客户对象可以访问
![](/icons/89684de.gif)
区别IDE操作
![](/icons/89684de.gif)
接口以抽象类IDEOperation
![](/icons/89684de.gif)
形式定义
1 public abstract
IDEOperation {
2
3 private Compiler cmp;
4
5 private Runtime rtime;
6
7 public void compile(String javaFile) {
8
9 cmp.compile(javaFile);
10
11 }
12
13 public void run(String
File) {
14
15 rtime.run (
File);
16
17 }
18
19 //to be delayed until needed.
20
21 public abstract void generateDocs(String javaFile);
22
23 public IDEOperation
{
24
25 cmp =
Compiler
;
26
27 rtime =
Runtime
;
28
29 }
30
31 }
32
="xspace-totlerecord">3
="xspace-totlepages">1/3
="xspace-current">123>
延伸阅读
最新评论