代理模式(Proxy Pattern)(四):HeadFirst中CD封面虚拟代理
一、问题描述
当我们在网络上加载一些图像时,限于连接宽带和网络负载,下载可能需要一些时间,所以在等待图像加载的时候,就应该显示一些东西。我们也不希望在等待图像时,整个应用程序被挂起。一旦图像加载完成,刚才显示的东西就应该消失,图像显示出来。
二、类图
三、实现代码
1.ImageComponent
class ImageComponent extends JComponent {private Icon icon;public ImageComponent(Icon icon) {this.icon = icon;}public void setIcon(Icon icon) {this.icon = icon;}public void paintComponent(Graphics g) {super.paintComponent(g);int w = icon.getIconWidth();int h = icon.getIconHeight();int x = (800 - w)/2;int y = (600 - h)/2;icon.paintIcon(this, g, x, y);}
}
2.代理类ImageProxy
class ImageProxy implements Icon {ImageIcon imageIcon;URL imageURL;Thread retrievalThread;boolean retrieving = false;public ImageProxy(URL url) { imageURL = url; }public int getIconWidth() {if (imageIcon != null) {return imageIcon.getIconWidth();} else {return 800;}}public int getIconHeight() {if (imageIcon != null) {return imageIcon.getIconHeight();} else {return 600;}}public void paintIcon(final Component c, Graphics g, int x, int y) {if (imageIcon != null) {imageIcon.paintIcon(c, g, x, y);} else {g.drawString("Loading CD cover, please wait...", x+300, y+190);if (!retrieving) {retrieving = true;retrievalThread = new Thread(new Runnable() {public void run() {try {imageIcon = new ImageIcon(imageURL, "CD Cover");c.repaint();} catch (Exception e) {e.printStackTrace();}}});retrievalThread.start();}}}
}
3.测试
public class ImageProxyTestDrive
{ImageComponent imageComponent;JFrame frame = new JFrame("CD Cover Viewer");JMenuBar menuBar;JMenu menu;Hashtable cds = new Hashtable();public static void main(String[] args) throws Exception{ImageProxyTestDrive testDrive = new ImageProxyTestDrive();}public ImageProxyTestDrive() throws Exception{cds.put("Ambient: Music for Airports","http://images.amazon.com/images/P/B000003S2K.01.LZZZZZZZ.jpg");cds.put("Buddha Bar","http://images.amazon.com/images/P/B00009XBYK.01.LZZZZZZZ.jpg");cds.put("Ima","http://images.amazon.com/images/P/B000005IRM.01.LZZZZZZZ.jpg");cds.put("Karma","http://images.amazon.com/images/P/B000005DCB.01.LZZZZZZZ.gif");cds.put("MCMXC A.D.","http://images.amazon.com/images/P/B000002URV.01.LZZZZZZZ.jpg");cds.put("Northern Exposure","http://images.amazon.com/images/P/B000003SFN.01.LZZZZZZZ.jpg");cds.put("Selected Ambient Works, Vol. 2","http://images.amazon.com/images/P/B000002MNZ.01.LZZZZZZZ.jpg");URL initialURL = new URL((String) cds.get("Selected Ambient Works, Vol. 2"));menuBar = new JMenuBar();menu = new JMenu("Favorite CDs");menuBar.add(menu);frame.setJMenuBar(menuBar);for (Enumeration e = cds.keys(); e.hasMoreElements();){String name = (String) e.nextElement();JMenuItem menuItem = new JMenuItem(name);menu.add(menuItem);menuItem.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){imageComponent.setIcon(new ImageProxy(getCDUrl(event.getActionCommand())));frame.repaint();}});}//建立框架和菜单Icon icon = new ImageProxy(initialURL);imageComponent = new ImageComponent(icon);frame.getContentPane().add(imageComponent);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(800, 600);frame.setVisible(true);}URL getCDUrl(String name){try{return new URL((String) cds.get(name));}catch (MalformedURLException e){e.printStackTrace();return null;}}
}
运行窗口:
(加载图片时显示"Loading CD cover, please wait...",反应太快,就不截图了)
转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8974694
代理模式(Proxy Pattern)(四):HeadFirst中CD封面虚拟代理相关推荐
- 二十四种设计模式:代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这 ...
- 设计模式-代理模式(Proxy Pattern)
设计模式-代理模式(Proxy Pattern) 文章目录 设计模式-代理模式(Proxy Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.小结 六.动态代理 ...
- Java24种设计模式(第二种)--代理模式(Proxy Pattern)
Java24种设计模式 (第二种) 一.代理模式(Proxy Pattern) 模式逻辑: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事 ...
- 设计模式——代理模式(Proxy Pattern)之为别人做嫁衣
代理模式Proxy Pattern 代理模式 1.背景 2.定义 3.特征 4.应用场景 5.实验案例 参考 代理模式 1.背景 假如说我现在想租一间房子,虽然我可以自己去找房源,做卫生检测等一系列的 ...
- 设计模式(结构型)之代理模式(Proxy Pattern)
PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...
- 代理模式-Proxy Pattern
在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象.例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买.又如 ...
- Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理
面试问题:Java里的代理设计模式(Proxy Design Pattern)一共有几种实现方式?这个题目很像孔乙己问"茴香豆的茴字有哪几种写法?" 所谓代理模式,是指客户端(Cl ...
- 代理模式(Proxy Pattern)
设计模式 - 吕震宇 .NET设计模式系列文章 薛敬明的专栏 乐在其中设计模式(C#) C#设计模式(13)-Proxy Pattern 一. 代理(Proxy)模式 代理(Proxy)模式给某一个对 ...
- 27代理模式(Proxy Pattern)
直接与间接: 人们对复杂的软件系统常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活. 满足特定需求的解决方案. ...
最新文章
- 贪心 双指针----Codeforces Round #727 (Div.2) D. PriceFixed
- swift_002(Swift的String的基本使用)
- 【转】Android Studio系列教程一--下载与安装
- maven jar包冲突的发现与解决[工具篇]
- Jackson用法详解
- KVM热迁移方式漫谈
- Tomcat新版本旧版本下载(Windows和Linux)
- 51nod 1050循环数组最大字段和
- Linux 上最好的视频编辑软件
- SAS安装时出现的问题:Diagram Control
- 跨境电商独立站海外引流渠道:Quora运营技巧
- 荧光量子产率计算机模拟,如何提高荧光染料的量子产率,或许可以从这里找到答案...
- 当使用VMware给虚拟机扩展硬盘容量时,显示无法扩展容量并提示:在部分链上无法执行所调用的函数,请打开父虚拟磁盘。
- 《UEFI内核导读》全集,2023年更新
- OpenCV项目1-OCR识别
- C# 终本案件、综合执行人、裁判文书爬虫
- 如何恢复小强中被修改的软件包
- Leetcode 1675. Minimize Deviation in Array [Python]
- 7行代码制作一个超声波测距仪
- Unity中使用代码将预制加载到场景