虚拟代理模式(Virtual Proxy)(图) (2)
[ 来源:互网络 | 更新日期:2007-09-16 04:24:40 | 浏览次数:18892]
简介:应用虚拟代理模式,需要设计一个与真实对象具有相同接口的单独对象(指虚拟代理)。不同的客户对象可以在创建和使用真实对象地方用相应的虚拟对象来代替。虚拟对象把真实对象的引用作为它的实例变量维护。代理对象不要自动创建真实对象,当客户需要真实对象的服务时,调用虚拟代理对象上的方法,并且检测真实对象是否被创建。
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.
*/


您的位置:
