[转载]虚拟代理模式(Virtualnbsp;Proxy)

article/2025/8/19 20:22:15
虚拟代理模式(Virtualnbsp;Proxy)

第25章 虚拟代理模式(Virtual Proxy)


描述:


虚拟代理模式 (Virtual Proxy)是一种节省内存的技术,它建议创建那些占用大量内存或处理复杂的对象时,把创建这类对象推迟到使用它的时候。在特定的应用 中,不同部分的功能由不同的对象组成,应用启动的时候,不会立即使用所有的对象。在这种情况下,虚拟代理模式建议推迟对象的创建直到应用程序需要它为止。 对象被应用第一次引用时创建并且同一个实例可以被重用。这种方法优缺点并存。
优点:
这种方法的优点是,在应用程序启动时,由于不需要创建和装载所有的对象,因此加速了应用程序的启动。
缺点:
因为不能保证特定的应用程序对象被创建,在访问这个对象的任何地方,都需要检测确认它不是空(null)。也就是,这种检测的时间消耗是最大的缺点。
应 用虚拟代理模式,需要设计一个与真实对象具有相同接口的单独对象(指虚拟代理)。不同的客户对象可以在创建和使用真实对象地方用相应的虚拟对象来代替。虚 拟对象把真实对象的引用作为它的实例变量维护。代理对象不要自动创建真实对象,当客户需要真实对象的服务时,调用虚拟代理对象上的方法,并且检测真实对象 是否被创建。
如果真实对象已经创建,代理把调用转发给真实对象
如果真实对象没有被创建:
1) 代理对象创建真实对象
2) 代理对象把这个对象分配给引用变量。
3) 代理把调用转发给真实对象
按 照这种安排,验证对象存在和转发方法调用这些细节对于客户是不可见的。客户对象就像和真实对象一样与代理对象进行交互。因此客户从检测真实对象是否为 null中解脱出来,另外,由于创建代理对象在时间和处理复杂度上要少于创建真实对象。因此,在应用程序启动的时候,用代理对象代替真实对象初始化。

例子:


假设我们建立一个JAVA程序的集成开发环境(Integrated Development Environment),这个环境包括三个功能:编译、 运行、生成JavaDoc文档。在新建和编辑Java程序时,最为常用的是编译和运行。至于生成JavaDoc文档对于每一个Java程序不是必需的。因 此,在Java开发环境启动时,不要创建和装载实现集成开发环境全部功能的所有对象,仅创建那些在编辑、编译、运行时用到的对象,保留提供生成 JavaDoc文档的对象,这是一个好的设计思想。这种对象创建策略能够高效地利用内存空间并且加快了集成开发环境的启动速度。
假设编译、运行、生成JavaDoc文档这些功能分别由三个工具类提供??Compiler、Runtime和JavaDoc。客户对象可以访问的不同IDE操作的接口以抽象类IDEOperation的形式定义。
  1. public abstract class IDEOperation {
  2. private Compiler cmp;
  3. private Runtime rtime;
  4. public void compile(String javaFile) {
  5. cmp.compile(javaFile);
  6. }
  7. public void run(String classFile) {
  8. rtime.run (classFile);
  9. }
  10. //to be delayed until needed.
  11. public abstract void generateDocs(String javaFile);
  12. public IDEOperation() {
  13. cmp = new Compiler();
  14. rtime = new Runtime();
  15. }
  16. }

类IDEOperation提供了编译、运行java程序方法的实现,作为它构造函数的一部分,IDEOperation创建和装载了进行编译和执行操作 的Compiler和Runtime对象。生成JavaDoc文档的方法generateDocs方法被设计成抽象的方法,由它的子类来实现。
让我们定义抽象类IDEOperation的一个具体子类RealProcessor。作为RealProcessor构造函数的一部分,创建JavaDoc对象来提供生成JavaDoc文档的服务,通过使用JavaDoc对象功能实现generateDocs方法。
  1. public class RealProcessor extends IDEOperation {
  2. JavaDoc jdoc;
  3. public RealProcessor() {
  4. super();
  5. jdoc = new JavaDoc();
  6. }
  7. public void generateDocs(String javaFile) {
  8. jdoc.generateDocs(javaFile);
  9. }
  10. }

通过上面的实现,RealProcessor类包含了编译、运行和生成JavaDoc文档的所有功能。像我们原来讨论的,生成JavaDoc文档的功能不 是每一个Java程序所必须的,当RealProcessor实例化的时候,包括负责生成JavaDoc文档的JavaDoc对象的一系列对象被创建。推 迟创建JavaDoc对象有以下优点:
1) 加速了RealProcessor对象的创建时间,因为它的构造函数创建的很少的对象。
2) 高效地利用内存,因为在不需要对象服务的时候,不需要把对象保持在内存中。
在 不改变RealProcessor实现的前提下,可以通过定义IDEOperation的另外一个子类ProxyProcessor来实现虚拟代理。因为 RealProcessor和ProxyProcessor共享相同的接口,客户对象可以用ProxyProcessor代替 RealProcessor。图25.1展示了类层次;
25.1.bmp
Figure 25.1: IDEOperation Class Hierarchy
  1. public class ProxyProcessor extends IDEOperation {
  2. private RealProcessor realProcessor;
  3. public void generateDocs(String javaFile) {
  4. /*
  5. In order to generate javadocs
  6. the proxy loads the actual object and
  7. invokes its methods.
  8. */
  9. if (realProcessor == null) {
  10. realProcessor = new RealProcessor();
  11. }
  12. realProcessor.generateDocs(javaFile);
  13. }
  14. }

作为自己的实例变量,ProxyProcessor维护了RealProcessor对象的一个引用。作为generateDocs方法的一部分, ProxyProcessor检测引用变量是否被初始化为RealProcessor对象。如果没有被初始化,它创建一个RealProcessor对象 并把这个对象分配给它的实例变量。一旦RealProcessor对象已经被创建,就调用其上的generateDocs方法。
实际上,也就是当客户对象第一次请求产生javadoc文档时,RealProcessor才被初始化装入内存中。反过来,直到客户需要为Java程序生成javadocs时,JavaDoc对象才会被创建和装入内存中。
客户对象像调用真实处理对象一样调用ProxyProcessor上的方法,并不需要关心(知道)RealProcessor对象是否存在。 至于验证、检测和ProxyProcessor和RealProcessor之间的交互、这样的细节对于客户对象是透明的。
  1. public class Client {
  2. public static void main(String[] args) {
  3. /*
  4. At this point objects required for
  5. the compile and run operations are
  6. created, but not the objects that provide the
  7. generate Javadoc functionality.
  8. */
  9. IDEOperation IDE = new ProxyProcessor();
  10. IDE.compile("test.java");
  11. IDE.run("test.class");
  12. /*
  13. The Javadoc functionality is accessed
  14. For the first time and hence the
  15. Object offering the Javadoc generation
  16. Functionality is loaded at this point.
  17. */
  18. IDE.generateDocs("test.java");
  19. }
  20. }

附件为原码和原文:
附件:29.rar(3K) 附件:Chapter_25.doc(71K)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-132294/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/374079/viewspace-132294/


http://chatgpt.dhexx.cn/article/wXQFqt8j.shtml

相关文章

代理模式——虚拟代理(二)

代理模式定义 为另一个对象提供一个替身或占位符以控制对这个对象的访问。使用代理模式创建代表对象,让代表对象控制对某对象的访问,被代理的对象可是远程的对象、创建开销大的对象或需要安全控制的对象。 代理分三种: 1.远程代理&#xff…

SQL语法与数据库快速入门(1)

目录 数据库简介数据库分类常用数据库简介使用场景MySql 的安装与配置数据库客户端工具MySql 介绍SQL 简介DDL 数据库操作-创建DDL 数据库操作-查看DDL 数据库操作-修改DDL 数据库操作-删除DDL 数据库表操作简介DDL 数据库表操作-创建DDL 数据库表操作-查看DDL 数据库表操作-修…

SQL语法与数据库快速入门(2)

目录: 多表简介SQL 约束-外键约束多表关系简介多表查询多表查询-内连接查询多表查询-外连接查询子查询简介子查询实战数据库进阶redis 内存数据库mongodb nosql 数据库neo4j 图数据库 1.多表简介 多表及使用场景介绍: 多表顾名思义就是在数据库设计中…

【数据库】MYSQL轻松入门

文章目录 MYSQL入门一、MYSQL概述1. 数据库相关概念1.1 数据库,数据库管理系统与SQL1.2 数据库种类以及主流数据库管理系统排名1.2.1 数据库的种类1.2.2 数据库主流排名 1.3 MySQL数据库安装1.3.1 下载1.3.2 修改密码 1.4 数据模型 二、SQL2.1 通用语法与注释2.2 SQ…

Java连接mysql数据库的五分钟快速入门教程

总体流程:数据库->Java 总体步骤: 1.创建数据库并新建表 2.创建一个Java项目,在项目下新建文件夹lib,类型为Directory 3.将下载好mysql-connector-java-8.0.27.jar放到lib目录下 4.将lib下的依赖添加到Java项目中 5.编写代码连…

数据库快速入门教程--视频

数据库快速入门教程--视频 下载地址:http://v.51work6.com/courseInfoRedirect.do?actioncourseInfo&courseId240579本课程是这个课程体系的核心之一,为软件开发人员所需数据库知识的学习教材,而不是培训一个DBA(数据库管理员…

Docker 安装与操作 Mysql 数据库快速入门

目录 演示环境说明 Mysql 镜像检索 Mysql 镜像下载 Mysql 容器运行 错误运行方式 正确运行方式 端口映射 连接测试 高级命令指定编码运行 演示环境说明 1、《 Docker 镜像操作 常用命令》中说明了如何从 Docker Hub 上下载镜像,《 Docker 容器操作 常用命…

数据库(MySQL)基础快速入门!

前言:这篇送给那些想要学会数据库,但又不想花太多时间的同学们。看了这篇数据库知识,轻轻松松搞定它!用不同的工具操作数据库命令可能会有小小的不同,我用的是系统自带的cmd。(凡是数据库名称,数…

MySQL数据库1——数据库快速入门

MySQL数据库——数据库基础 (一)为什么使用数据库 数据库用来存储海量数据数据库利于数据查询和管理数据库相对于文件安全性更高数据库相对于文件利于控制 (二)MySQL的基本使用 安装好MySQL数据库以后,连接服务器。…

mysql快捷创建数据库_mysql数据库快速入门(1)

1、数据库操作 1.1、连接mysql服务器 mysql -u root( 用户名 ) -p 1.2、退出mysql命令提示窗 exit 1.3、查看版本 SELECT VERSION(); 1.4、列出数据库列表 SHOW DATABASES; 1.5、创建数据库 CREATE DATABASE IF NOT EXISTS [database] DEFAULT CHARSET UTF8; 1.6、选择要操作的…

SQLite3数据库的快速入门菜鸟教程

SQLite3是一个轻量级嵌入式数据库,其主要有以下的特点: 1、零配置无需安装和管理配置; 2、储存在单一磁盘文件中; 3、数据库文件可在不同字节序的机器自由共享; 4、比目前流行的大多数数据库对数据的操作要快&…

MySQL数据库快速入门

MySQL基础 1、数据库相关概念 以前我们做系统,数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会丢失的效果,当然文件存储也有它的弊端。假设在文件中存储以下的数据: 姓名 年龄 性别 住址 张三 23 男 北京西三旗…

MySQL数据库快速入门到精通(超详细保姆级,建议收藏)这可能是目前最适合你的教程,从基础语法到实例演示。

前言 此文章旨在为需要掌握快速开发和复习MySQL的同学所准备,您完全可以把此文章当作参考文档来使用,本文将尽量精简,使您快速的理解和掌握语法。 关于MySQL MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,…

超经典两万字,MySQL数据库快速入门。

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」:此文章已录入专栏《MySQL数据库快速入门》 MySQL快速入门 一、环境准备1. MySQL下载及安装2. MySQL启动3. MySQL客…

SQL数据库快速入门基础

SQL(Structure Query Language,结构化查询语言)语言是国际标准化组织(ISO)采纳的标准数据库语言。 数据库就是一幢大楼,我们要先盖楼,然后再招住户(住户当然就是数据库对象,)。我们盖得大楼的基本格局设计师们已经为我们设计好,我们在创建数据库过程中,系统(设计师)…

数据库快速入门

数据库快速入门 目录 数据库快速入门 1. 数据库基础知识入门 2. Postgre数据库介绍 3. 数据库入门操作 3.1常用命令 3.2 数值类型 3.3 数据运算符 4. 常用函数介绍 4.1 常用函数介绍 4.2 自定义函数 5 数据库索引和视图介绍 5.1 数据库索引介绍 5.2 数据库视图介…

计算机类书籍大全

空降百度网盘: 链接:https://pan.baidu.com/s/1yG198vf_xxBUKW2q-aYm4A 提取码:sll1

爬虫之 爬取京东计算机书籍

爬取京东的计算机类书籍 1. 工具: requests, pycharm, scrapy, mongodb 2. 网页提取工具: xpath 1. 分析京东网页: 打开京东网站 查看源码发现不是动态网页,而且都是列表, 说明了很好处理;开始分析; 我们只要提取书名,书的链…

计算机专业必读哪些经典书籍?

大家好,我是狗哥。 经常有粉丝问:狗哥,我想学计算机,应该读哪些书籍?那么多计算机书籍,我如何选?,今天狗哥就把自己的书单发出来,供大家参考,并附上连接&…

国家电网计算机类备考经验分享

刚刚参加完国家电网计算机类23届的笔试和面试,笔试78,为了给备考国家电网计算机类的小伙伴提供一些有用的信息,给大家分享一个经验贴。本文分为4部分。分别为:个人情况、复习时间线、所用书籍、经验分享。希望这篇文章可以解决小伙…