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

代理分三种:

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. 使用zerotier让异地设备组局域网
  2. CUDA error: an illegal memory access was encountered
  3. 手脱EZIP v1.0
  4. three.js 几何体-组合网格_ThreeJS 粒子系统实现雪花飘落动画
  5. S7 Linux用户管理及用户信息查询命令
  6. 电商系统的自提订单,提货流程如何设计
  7. Ubuntu下安装配置java及环境变量
  8. cakephp 1.3 Views
  9. mongodb的文档游标
  10. 老子《道德经》第三十七章
  11. TimePickerView(日期选择器)
  12. linux 配置路由时via,详解Linux系统中配置静态路由的方法
  13. 关于直播,所有的技术细节都在这里了(四)
  14. android 导出数据库文件
  15. 【2019百度之星初赛三1002=HDU6714】最短路 2(spfa+思维)
  16. undo log、rollback segment
  17. 基本的广告法违禁词、违规词以及敏感词大全
  18. 对电话号码进行格式校验、脱密、加密、解密、掩码等的操作介绍
  19. 使用程序自动调用ANSYS并运行命令流文件
  20. 木板切割问题(二)——动态规划

热门文章

  1. vue技术点(3)—vuex、插槽、自定义指令、vue动画、keep-alive使用、mixin
  2. 将Ubuntu系统安装到移动硬盘上,打造一个随身携带,即插即用的操作系统
  3. 求生技能必备:如何从被困水中的车里逃生
  4. 二战生的考研经验分享(一)个人经历
  5. 以太坊的数据结构(状态树、交易树、收据树)及代码分析
  6. 设计模式之四:简单工厂(披萨店生产披萨模拟流程)
  7. 关闭NetworkManager
  8. linux使用wget安装Maven
  9. 【目标跟踪: 相关滤波器 三】循环矩阵
  10. 天津专升本报考条件!及升本本科院校专业限制报考专业限制情况