代理模式——虚拟代理(二)
代理模式定义
为另一个对象提供一个替身或占位符以控制对这个对象的访问。使用代理模式创建代表对象,让代表对象控制对某对象的访问,被代理的对象可是远程的对象、创建开销大的对象或需要安全控制的对象。
代理分三种:
1.远程代理,帮助我们控制访问远程对象:
远程代理可以作为另一个JVM上对象的本地代表。调用代理的方法,会被代理利用网络转发到远程执行,并且结果会通过网络返回给代理,再由代理将结果转给客户。
2.虚拟代理,帮助我们控制访问创建开销大的资源
虚拟代理作为创建开销大的对象的代表,经常会直到我们真正需要一个对象的时候才创建它。当对象在创建前和创建中时,由虚拟代理地来扮演对象的替身。对象创建后,代理就会将请求直接委托给对象。
3.保护代理,基于权限控制对资源的访问。
本篇讲一讲虚拟代理:
虚拟代理用于隐藏开销大的对象,如我们需要通过网络取得图像数据。
ImageProxy的工作过程:
- ImageProxy首先创建一个ImageIcon,然后开始从网络URL上加载图像
- 在加载过程中,ImageProxy显示占位图
- 当图像加载完毕,ImageProxy把所有方法调用都委托给真正的ImageIcon,这些方法包括getIconHeight()、getIconWidth()、paintIcon()。
- 如果用户请求请的图像,我们就创建新的代理,重复这样的过程。
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代码。
谢谢阅读!有兴趣可以前往《代理模式——保护代理(三)》进行阅读。
代理模式——虚拟代理(二)相关推荐
- JS设计模式之代理模式-虚拟代理
定义 为一个对象提供一种代理以控制对这个对象的访问 分类 虚拟代理:虚拟代理是把一些开销很大的对象,延迟到真正需要它的时候才去创建执行 安全代理:控制真实对象的访问权限 远程代理(一个对象将不同空间的 ...
- 代理模式 虚拟代理实现图片预加载
代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问. 在Web开发中,图片预加载是一种常用的技术,如果直接给某个img标签节点设置src属性,由于图片过大或者网络不佳,图片的位置往往有段时 ...
- 代理模式——虚拟代理(结构型)
上一章已经了解了远程代理,这一章将会介绍虚拟代理 代理分三种: 1.远程代理,帮助我们控制访问远程对象: 远程代理可以作为另一个JVM上对象的本地代表.调用代理的方法,会被代理利用网络转发到远程执行, ...
- 代理模式 -虚拟代理 ProxyPattern
interface IVirtualProxy { void Request(); } 虚拟代理接口 using System; using System.Threading; class Virtu ...
- 代理模式——远程代理(一)
代理模式定义 为另一个对象提供一个替身或占位符以控制对这个对象的访问.使用代理模式创建代表对象,让代表对象控制对某对象的访问,被代理的对象可是远程的对象.创建开销大的对象或需要安全控制的对象. 代理分 ...
- 代理模式(三):远程代理,虚拟代理,缓冲代理
15.4 远程代理 远程代理(Remote Proxy)是一种常用的代理模式,它使得客户端程序可以访问在远程主机上的对象,远程主机可能具有更好的计算性能与处理速度,可以快速响应并处理客户端的请求.远程 ...
- 【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )
文章目录 前言 一.模拟 JVM 生成对应的 代理对象 二.模拟 JVM 生成对应的 代理对象 完整流程展示 1.目标对象接口 2.被代理对象 3.调用处理程序 4.模拟 JVM 生成的代理对象类 5 ...
- 【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )
文章目录 前言 一.静态代理的弊端 二.动态代理的优势 三.动态代理使用流程 1.目标对象接口 2.被代理对象 3.调用处理程序 4.客户端 四.动态生成 代理对象 类 的 字节码 文件数据 前言 代 ...
- 【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
最新文章
- python下载安装教程3.8.0-Python3.8.0
- Dom4J的基本使用
- 64位 vs2010 和 opencv2.4.4 配置问题
- 【算法】漫画:如何找到链表的倒数第n个结点?
- mysql语句中事务可靠性_MYSQL中的事务
- shaderlab UV动画所需的变量声明
- shell脚本判断linux系统,并判断该系统版本号,从而关闭防火墙
- 【CodeForces - 569B】Inventory (水题)
- 论文浅尝 | 基于知识库的自然语言理解 04#
- ps 2键盘代码 c语言,MicroBlaze中断编程——以PS/2键盘输入为例
- Cisco *** 完全配置指南-连载-PPTP和L2TP
- Rabbit MQ 安装
- DSSM模型的原理简介,预测两个句子的语义相似度
- 多线程之线程通信条件Condition
- 135行实现CRUD功能(PHP)
- MySQL的数据操作
- 证券交易所--本方最优对手方最优的区别
- Matlab入门(隐藏图片)
- 高等数学上学习总结(集合,邻域,函数)
- 企业级运维——Mysql主从复制(异步、半同步、全同步)
热门文章
- JAVA17中使用JS引擎Nashorn
- vue如何请求后端数据
- 在Anaconda中安装pytorch的详细步骤+PyCharm环境配置
- converter.HttpMessageNotReadableException: JSON parse error: default constructor not found. 的解决办法
- 中科大计算机考研压分吗,考研院校里,这些学校不压分、不歧视专科生,值得关注...
- 【目标跟踪: 相关滤波器 三】循环矩阵
- MATLAB如何导出高质量的图片?
- 动手学深度学习——卷积层
- FTP、TFTP、HTTP、SMTP、DHCP、Telnet、DNS、SNMP(网络协议:应用层协议)
- iOS 上使用 WCDB