【设计形式】学习笔记16:代理模式之虚拟代理(实现CD封面加载器)
【设计模式】学习笔记16:代理模式之虚拟代理(实现CD封面加载器)本文出自http://blog.csdn.net/shuangde800在
【设计模式】学习笔记16:代理模式之虚拟代理(实现CD封面加载器)
本文出自 http://blog.csdn.net/shuangde800
在上篇中,我们学习了代理模式,并用Java RMI实现了一个最简单的远程代理。实际上代理模式并不仅仅应用与远程代理,还有很多其他的应用。比如:虚拟代理。代理模式可以以很多形式出现,但基本上符合一般代理的设计。为何有这么多的形式呢?因为代理模式可以被用在许多不同的例子中。
走进代理模式
我们打算建立一个应用程序,用来展现你最喜欢的CD封面。你可以建立一个CD标题菜单,然后从豆瓣等网站的在线服务中取得CD封面的图。如果使用Swing,可以创建一个Icon接口从网络上加载图像。唯一的问题是,限于连接带宽和网络负载,下载可能需要一些时间,所以在等待图片加载的时候,应该显示一些东西。我们希望在等待图像时整个应用程序被挂起。一旦图像被加载完成,刚才显示的东西应该消失,图像显示出来。
效果图:正在下载中:
下载完成并且显示:
想要做到这样,简单的方式就是利用虚拟代理。虚拟代理可以代理Icon,管理背景的加载,并在加载未完成时显示“CD封面加载中,请稍后......”,一旦加载完成,代理就把显示的职责
委托给Icon
比较远程代理和虚拟代理:
远程代理:远程代理可以作为另一个JVM上对象的本地代表。调用代理的方法,会被代理利用网络转发到远程执行,并且结果会通过网络返回给代理,再由代理将结果转给客户。
虚拟代理:虚拟代理是作为创建开销大的对象的代表。虚拟代理经常直到我们真正需要一个对象的时候才创建它。当对象在创建前和创建中时,由虚拟代理来扮演对象的替身。对象创建后,代理就会将请求直接委托给对象。
设计CD封面虚拟代理此类图和远程代理的图很类似,但是这里的代理是用于隐藏创建开销大的对象(因为我们要通过网络取得图像数据),而不是隐藏在网络其他地方的对象
ImageProxy如何工作:1. ImageProxy首先创建一个ImageIcon,然后开始从网络URL上加载图像2. 在加载的过程中,ImageProxy显示”CD封面加载中,请稍后......“3. 当图像加载完毕,ImageProxy把所有方法调用委托给真正的ImageIcon,这些方法包括了paintIcon(), getWidth()和getHeight().4. 如果用户请求新的图像,我们就创建新的代理,重复这样的过程。
使用虚拟代理实现CD封面加载器
1. 编写ImageProxy