您的位置:jsp学习站首页 >> JAVA类 >> JAVA高级 >> 虚拟代理模式(Virtual Proxy)(图)

虚拟代理模式(Virtual Proxy)(图) (2)

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