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

article/2025/8/19 20:30:16

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

代理分三种:

1.远程代理,帮助我们控制访问远程对象:
远程代理可以作为另一个JVM上对象的本地代表。调用代理的方法,会被代理利用网络转发到远程执行,并且结果会通过网络返回给代理,再由代理将结果转给客户。
2.虚拟代理,帮助我们控制访问创建开销大的资源
虚拟代理作为创建开销大的对象的代表,经常会直到我们真正需要一个对象的时候才创建它。当对象在创建前和创建中时,由虚拟代理地来扮演对象的替身。对象创建后,代理就会将请求直接委托给对象。
3.保护代理,基于权限控制对资源的访问。

本篇讲一讲虚拟代理:
虚拟代理用于隐藏开销大的对象,如我们需要通过网络取得图像数据。
在这里插入图片描述
ImageProxy的工作过程:

  1. ImageProxy首先创建一个ImageIcon,然后开始从网络URL上加载图像
  2. 在加载过程中,ImageProxy显示占位图
  3. 当图像加载完毕,ImageProxy把所有方法调用都委托给真正的ImageIcon,这些方法包括getIconHeight()、getIconWidth()、paintIcon()。
  4. 如果用户请求请的图像,我们就创建新的代理,重复这样的过程。

Icon接口:

public interface Icon {int getIconWidth();int getIconHeight();void paintIcon(ImageView imageView);
}

ImageProxy代码:

public class ImageProxy implements Icon {ImageIcon imageIcon; //这是加载后显示出来的真正图像URL imageURL;  //真正图像的URLThread retrievalThread;boolean retrieving = false;Bitmap bitmap;//占位图ImageView imageView;显示图片的容器private Handler refresh = new Handler(){@Overridepublic void handleMessage(Message msg) {ImageProxy.this.paintIcon(imageView);}};public ImageProxy(URL url,Bitmap bitmap){this.imageURL = url;  this.bitmap = bitmap;}@Overridepublic int getIconWidth() {if(imageIcon != null){return imageIcon.getIconWidth();}else{return 800;}}@Overridepublic int getIconHeight() {if(imageIcon != null){return imageIcon.getIconHeight();}else{return 600;}}@Overridepublic void paintIcon(ImageView imageView) {this.imageView = imageView;if(imageIcon != null){imageIcon.paintIcon(imageView);}else{imageView.setImageBitmap(bitmap);if(!retrieving){retrieving = true;retrievalThread = new Thread(new Runnable() {@Overridepublic void run() {if(imageURL != null){try {HttpURLConnection conn = (HttpURLConnection) imageURL.openConnection();conn.setDoInput(true);conn.connect();InputStream is = conn.getInputStream();Bitmap bitmap1 = BitmapFactory.decodeStream(is);imageIcon = new ImageIcon(bitmap1);is.close();refresh.sendEmptyMessage(1); //图像加载完成后,自动刷新}catch (Exception e){e.printStackTrace();}}}});retrievalThread.start();}}}
}

ImageIcon代码:

public class ImageIcon implements Icon {Bitmap bitmap;public ImageIcon(Bitmap bitmap) {this.bitmap = bitmap;}@Overridepublic int getIconWidth() {if (bitmap != null) {return bitmap.getWidth();}return 0;}@Overridepublic int getIconHeight() {if (bitmap != null) {return bitmap.getHeight();}return 0;}@Overridepublic void paintIcon(ImageView imageView) {if (imageView != null && bitmap != null) {imageView.setImageBitmap(bitmap);}}
}

ImageProxy控制ImageIcon的访问。代理将客户从ImageIcon解耦了,如果它们之间没有解耦,客户就必须等到每幅图像都被取回,然后才能把它绘制到界面上。

代理模式有很多变体,这些变体都有一个共通点:都会将客户对主题(subject)施加的方法调用拦截下来。这种间接的级别让我们可以做很多事,包括将请求分发到远程主题;给创建开销大的对象提供代表;提供某些级别的保护,这种保护能决定哪些客户能调用哪些方法

这里要与装饰者区分开,装饰者为对象增加行为,而代理是控制对象的访问。

最后分享Demo代码。

谢谢阅读!有兴趣可以前往《代理模式——保护代理(三)》进行阅读。


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

相关文章

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部分。分别为:个人情况、复习时间线、所用书籍、经验分享。希望这篇文章可以解决小伙…

计算机专业必读的经典书籍!!(建议收藏)

第一个系列:基础 要说哪些书是计算机的经典书籍,我猜很多人都要推荐机械工业出版社引进的黑皮书系列了,你就看吧,每一本都很适合垫显示器垫桌角,垫显示器这个其实只不过是一个调侃而已,之所以这么说&#…