`
fly.net.cn
  • 浏览: 187317 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java设计模式之虚拟代理模式

阅读更多

优点:

这种方法的优点是,在应用程序启动时,由于不需要创建和装载所有的对象,因此加速了应用程序的启动。

缺点:

因为不能保证特定的应用程序对象被创建,在访问这个对象的任何地方,都需要检测确认它不是空(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展示了类层次;

Java设计模式之虚拟代理模式 

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设计模式之虚拟代理模式详解 #### 一、引言 在软件工程领域,设计模式作为一种被广泛接受的最佳实践,对于提高代码质量和可维护性起着至关重要的作用。其中,“代理模式”作为结构型设计模式之一,在解决...

    java设计模式的应用

    ### Java设计模式的应用 #### 一、引言 在当今快速发展的软件开发领域,Java作为一门功能强大且灵活的语言,不仅拥有丰富的API资源,还能与强大的数据库系统无缝对接。这使得许多开发人员能够以模块化的形式构建...

    JAVA设计模式例程-代理模式

    在这个"JAVA设计模式例程-代理模式"的压缩包中,我们可以深入学习如何在Java中实现这一模式。 1. **代理模式的基本概念** 代理模式的核心思想是为一个目标对象创建一个代理对象,代理对象在客户端和目标对象之间起...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    浅析Java设计模式【3】——代理.pdf

    ### 浅析Java设计模式【3】——代理 #### 一、代理模式概述 代理模式是一种行为型设计模式,主要用于在客户端与目标对象之间起到一个中介的作用,通过代理对象来控制对目标对象的访问。代理模式的核心在于它可以...

    java的设计模式.对java设计模式的理解.

    Java设计模式是软件开发中的一种最佳实践,它们是经过时间考验、被广泛接受的解决方案,用于解决在编写可维护和可扩展的Java应用程序时经常遇到的问题。这些模式提供了通用的框架,可以用来解决特定问题,使得代码...

    设计模式之代理模式demo

    代理模式是一种常用的设计模式,它在软件开发中起到了中介或者代表的作用。代理模式的主要目的是为其他对象提供一种代理以控制对这个对象的访问。通过引入代理,我们可以增加新的功能,如缓存、日志记录、访问控制等...

    23种JAVA设计模式和15种J2EE设计模式

    7. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问,如远程代理、虚拟代理等。 8. **外观模式**:提供一个简单的统一接口,隐藏系统的复杂性。 9. **桥接模式**:将抽象部分与实现部分分离,使它们...

    Java设计模式(第2版)中文版 高清版本 带书签

    《Java设计模式(第2版)》是一本深入探讨Java编程中设计模式的权威书籍,中文版的出现使得更多的国内开发者能够无障碍地学习这门重要的技术。设计模式是软件工程中经过长期实践验证的解决方案,它为解决常见问题提供...

    JAVA设计模式整理(有部分参考代码)

    7. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问,通常用于远程代理、虚拟代理和保护代理等场景。 8. **桥接模式**:将抽象部分与实现部分分离,使它们可以独立变化。 9. **组合模式**:表示部分-...

    Java设计模式帮助文档

    Java设计模式是软件工程中的一种最佳实践,它提供了一种在特定情况下解决复杂问题的模板。这份“Java设计模式帮助文档”无疑是Java开发者的重要参考资料,它涵盖了多种设计模式的详细解释和实例应用,有助于提升代码...

    Java设计模式之结构型模式源码以及文档

    今天我们要探讨的是“Java设计模式之结构型模式”。结构型模式主要关注如何组织类和对象,以达到良好的架构,提升代码的可读性和可维护性。在这个主题中,我们将深入理解并讨论这些模式的原理、应用场景及其实现。 ...

    java设计模式实例

    6. **代理模式(Proxy)**:为其他对象提供一种代理以控制对这个对象的访问,可以用于远程代理、虚拟代理、安全代理等。 7. **适配器模式(Adapter)**:将一个类的接口转换成客户希望的另一个接口,使得原本由于...

    java设计模式迷你手册.rar

    Java设计模式迷你手册是一部浓缩了Java编程领域中设计模式精华的参考书,旨在帮助开发者理解和应用这些模式,提升代码质量和可维护性。设计模式是软件工程中...总之,掌握Java设计模式是提升编程技能的关键步骤之一。

    《Java设计模式》源代码

    Java设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,可以提高代码的可重用性、可维护性和可扩展性。本压缩包包含的是《Java设计模式》一书的配套源代码,涵盖了21种经典的设计模式,这些都...

    java设计模式(源代码).rar

    Java设计模式是软件开发中的一种最佳实践,它提供了一套经过时间验证的解决方案,用于解决在构建可维护、可扩展的软件系统时遇到的常见问题。这个压缩包“java设计模式(源代码).rar”显然包含了用Java语言实现的...

    java设计模式与经验总结

    代理模式提供了一种对目标对象进行控制的途径,比如远程代理、虚拟代理等。 行为型模式中,观察者模式实现了发布-订阅机制,当对象状态改变时,所有依赖该对象的其他对象都会得到通知。策略模式允许我们在运行时...

    图解Java设计模式笔记总结word版本.rar

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可重用性、可维护性和灵活性。本资料“图解Java设计模式笔记总结word版本”聚焦于通过图文并茂的方式,深入浅出地解析...

    java 设计模式文档大全

    6. 代理模式:为其他对象提供一种代理以控制对这个对象的访问,常用于远程代理、虚拟代理和保护代理。 7. 观察者模式:定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...

Global site tag (gtag.js) - Google Analytics