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

代理分三种:

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代码。

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

代理模式——虚拟代理(二)相关推荐

  1. JS设计模式之代理模式-虚拟代理

    定义 为一个对象提供一种代理以控制对这个对象的访问 分类 虚拟代理:虚拟代理是把一些开销很大的对象,延迟到真正需要它的时候才去创建执行 安全代理:控制真实对象的访问权限 远程代理(一个对象将不同空间的 ...

  2. 代理模式 虚拟代理实现图片预加载

    代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问. 在Web开发中,图片预加载是一种常用的技术,如果直接给某个img标签节点设置src属性,由于图片过大或者网络不佳,图片的位置往往有段时 ...

  3. 代理模式——虚拟代理(结构型)

    上一章已经了解了远程代理,这一章将会介绍虚拟代理 代理分三种: 1.远程代理,帮助我们控制访问远程对象: 远程代理可以作为另一个JVM上对象的本地代表.调用代理的方法,会被代理利用网络转发到远程执行, ...

  4. 代理模式 -虚拟代理 ProxyPattern

    interface IVirtualProxy { void Request(); } 虚拟代理接口 using System; using System.Threading; class Virtu ...

  5. 代理模式——远程代理(一)

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

  6. 代理模式(三):远程代理,虚拟代理,缓冲代理

    15.4 远程代理 远程代理(Remote Proxy)是一种常用的代理模式,它使得客户端程序可以访问在远程主机上的对象,远程主机可能具有更好的计算性能与处理速度,可以快速响应并处理客户端的请求.远程 ...

  7. 【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )

    文章目录 前言 一.模拟 JVM 生成对应的 代理对象 二.模拟 JVM 生成对应的 代理对象 完整流程展示 1.目标对象接口 2.被代理对象 3.调用处理程序 4.模拟 JVM 生成的代理对象类 5 ...

  8. 【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )

    文章目录 前言 一.静态代理的弊端 二.动态代理的优势 三.动态代理使用流程 1.目标对象接口 2.被代理对象 3.调用处理程序 4.客户端 四.动态生成 代理对象 类 的 字节码 文件数据 前言 代 ...

  9. 【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. python下载安装教程3.8.0-Python3.8.0
  2. Dom4J的基本使用
  3. 64位 vs2010 和 opencv2.4.4 配置问题
  4. 【算法】漫画:如何找到链表的倒数第n个结点?
  5. mysql语句中事务可靠性_MYSQL中的事务
  6. shaderlab UV动画所需的变量声明
  7. shell脚本判断linux系统,并判断该系统版本号,从而关闭防火墙
  8. 【CodeForces - 569B】Inventory (水题)
  9. 论文浅尝 | 基于知识库的自然语言理解 04#
  10. ps 2键盘代码 c语言,MicroBlaze中断编程——以PS/2键盘输入为例
  11. Cisco *** 完全配置指南-连载-PPTP和L2TP
  12. Rabbit MQ 安装
  13. DSSM模型的原理简介,预测两个句子的语义相似度
  14. 多线程之线程通信条件Condition
  15. 135行实现CRUD功能(PHP)
  16. MySQL的数据操作
  17. 证券交易所--本方最优对手方最优的区别
  18. Matlab入门(隐藏图片)
  19. 高等数学上学习总结(集合,邻域,函数)
  20. 企业级运维——Mysql主从复制(异步、半同步、全同步)

热门文章

  1. JAVA17中使用JS引擎Nashorn
  2. vue如何请求后端数据
  3. 在Anaconda中安装pytorch的详细步骤+PyCharm环境配置
  4. converter.HttpMessageNotReadableException: JSON parse error: default constructor not found. 的解决办法
  5. 中科大计算机考研压分吗,考研院校里,这些学校不压分、不歧视专科生,值得关注...
  6. 【目标跟踪: 相关滤波器 三】循环矩阵
  7. MATLAB如何导出高质量的图片?
  8. 动手学深度学习——卷积层
  9. FTP、TFTP、HTTP、SMTP、DHCP、Telnet、DNS、SNMP(网络协议:应用层协议)
  10. iOS 上使用 WCDB