- 浏览: 341339 次
- 性别:
- 来自: 广州
文章分类
最新评论
一:加载延缓
相信大家都遇到这样的情况,一个系统需要加载一个模块,但是此模块的加载要耗费相当长的时间,因此,系统要显示一段"正在加载"的信息,同时将模块加载,在模块加载后,系统将"正在加载"的文字取消掉,并启动此模块,常见的例子有Netscape浏览器,JBuilder等大型软件.有时候加载一个图像也会造成时间的延迟,因此系统需要在放置图像的地方放一段文字信息,请用户用心等待。系统会在另一个线程中加载图像,而一旦图像加载完毕,就将等待信息换成该图像,这种做法叫做加载延缓,加载延缓显然是比较友好的用户界面的设计方案.
二:虚拟代理模式的应用
当一个真实主题对象的加载需要耗费资源时,一个虚拟代理对象可以代理真实对象接受请求,一旦接到请求,代理对象马上打出一段"正在加载"的信息,并在适当的时候加载真实主题对象,也就是模块或者图像.本章将给出一个加载图像的例子,由于图像的加载会耗费一定的资源,因此,要求设计一个虚拟代理对象,以替代图像对象接受客户端的请求,当虚拟代理对象接到请求后,会按照预定的逻辑首先显示一段等待信息,然后在另一个线程中加载图像.当图像加载完成后,主线程会决定将图像显示出来.
三:系统的设计
系统由一个JFrame对象,一个Icon对象以及此Icon对象的虚拟代理对象组成.系统的客户端对象调用代理ImageIconProxy对象,而此代理则负责将调用传递给真实主题角色,即一个ImageIcon对象。客户端调用代理ImageIconProxy对象时,此代理对象调用所传入的Graphics对象的drawRec()方法显示一段"Loading photo.."的等待信息,然后代理对象创建一个内部线程对象,并将之传入SwingUtilities的invokeLater()方法中,让它负责加载真实主题,至此,代理对象成功地延迟了真实主题的加载,随后,代理主题认为显示真实主题的时机成熟了,于是将真实主题(也就是图像)显示出来.
下面是系统的源代码:
在例子中使用了SwingUtilities.invokeLater()方法开启一个独立的新线程,用以执行一个新的任务,这个新的任务就是首先休眠2秒钟,然后加载图像,在加载完成后重新描绘视窗.SwingUtilities另有一个与invokeLater()方法相似的方法---invokeAndWait(),后者与前者不同的是,它会将主线程的执行封锁住,直到新线程的任务完成为止.
这个模式挺实用的..
相信大家都遇到这样的情况,一个系统需要加载一个模块,但是此模块的加载要耗费相当长的时间,因此,系统要显示一段"正在加载"的信息,同时将模块加载,在模块加载后,系统将"正在加载"的文字取消掉,并启动此模块,常见的例子有Netscape浏览器,JBuilder等大型软件.有时候加载一个图像也会造成时间的延迟,因此系统需要在放置图像的地方放一段文字信息,请用户用心等待。系统会在另一个线程中加载图像,而一旦图像加载完毕,就将等待信息换成该图像,这种做法叫做加载延缓,加载延缓显然是比较友好的用户界面的设计方案.
二:虚拟代理模式的应用
当一个真实主题对象的加载需要耗费资源时,一个虚拟代理对象可以代理真实对象接受请求,一旦接到请求,代理对象马上打出一段"正在加载"的信息,并在适当的时候加载真实主题对象,也就是模块或者图像.本章将给出一个加载图像的例子,由于图像的加载会耗费一定的资源,因此,要求设计一个虚拟代理对象,以替代图像对象接受客户端的请求,当虚拟代理对象接到请求后,会按照预定的逻辑首先显示一段等待信息,然后在另一个线程中加载图像.当图像加载完成后,主线程会决定将图像显示出来.
三:系统的设计
系统由一个JFrame对象,一个Icon对象以及此Icon对象的虚拟代理对象组成.系统的客户端对象调用代理ImageIconProxy对象,而此代理则负责将调用传递给真实主题角色,即一个ImageIcon对象。客户端调用代理ImageIconProxy对象时,此代理对象调用所传入的Graphics对象的drawRec()方法显示一段"Loading photo.."的等待信息,然后代理对象创建一个内部线程对象,并将之传入SwingUtilities的invokeLater()方法中,让它负责加载真实主题,至此,代理对象成功地延迟了真实主题的加载,随后,代理主题认为显示真实主题的时机成熟了,于是将真实主题(也就是图像)显示出来.
下面是系统的源代码:
package cai.milenfan.basic.test; import java.awt.Component; import java.awt.Graphics; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.SwingUtilities; public class ImageIconProxy implements Icon{ private ImageIcon realIcon = null; private String imageName; private int width; private int height; boolean isIconCreated = false; public ImageIconProxy(String imageName,int width,int height){ this.imageName = imageName; this.width = width; this.height = height; } public int getIconHeight() { return realIcon.getIconHeight(); } public int getIconWidth() { return realIcon.getIconWidth(); } //加载图像 public void paintIcon(final Component c, Graphics g, int x, int y) { if(isIconCreated){ realIcon.paintIcon(c, g, x, y); g.drawString("Java and Patterns by Milenfan", x 20, y 370); }else{ g.drawRect(x, y, width-1, height-1); g.drawString("Loading...", x 20, y 20); //图像在另外一个线程中被加载 synchronized(this){ SwingUtilities.invokeLater(new Runnable(){ public void run() { try { //延缓图像的加载过程,以显示效果 Thread.currentThread().sleep(2000); //将图像加载 realIcon = new ImageIcon(imageName); isIconCreated = true; } catch (InterruptedException e) { e.printStackTrace(); } //当图像被完全加载后,重新描绘视窗构件 c.repaint();//c要用final修饰 }}); } } } }
package cai.milenfan.basic.test; import javax.swing.Icon; import javax.swing.JFrame; import java.awt.Graphics; import java.awt.Insets; public class Client extends JFrame{ private static int IMAGE_WIDTH = 400; private static int IMAGE_HEIGHT = 300; private Icon imageIconProxy = null; public Client(){ super("使用代理进行图像的延迟加载..."); imageIconProxy = new ImageIconProxy("c:/ZK-Logo.gif",IMAGE_WIDTH,IMAGE_HEIGHT); setBounds(100,100,IMAGE_WIDTH 10,IMAGE_HEIGHT 30); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } //置换java.awt.Container的方法 public void paint(Graphics g){ super.paint(g); Insets insets = getInsets(); imageIconProxy.paintIcon(this, g, insets.left, insets.top); } static public void main(String[] args){ Client app = new Client(); app.show(); } }
在例子中使用了SwingUtilities.invokeLater()方法开启一个独立的新线程,用以执行一个新的任务,这个新的任务就是首先休眠2秒钟,然后加载图像,在加载完成后重新描绘视窗.SwingUtilities另有一个与invokeLater()方法相似的方法---invokeAndWait(),后者与前者不同的是,它会将主线程的执行封锁住,直到新线程的任务完成为止.
这个模式挺实用的..
发表评论
-
Mina重连
2014-05-26 21:29 2927import com.sun.swing.internal. ... -
面试经典
2014-05-24 09:29 6431.mysql innodb引擎,什么叫聚集索引,与非聚集索 ... -
一拍网网站系统架构图
2014-03-28 21:24 623一拍网网站系统架构图 -
Window下安装配置nginx
2013-08-12 16:53 809安装:http://www.cnblogs.com/wen ... -
使用线程池的好处
2013-07-18 14:41 1252使用线程池有两个好处: 1.可以创建和销毁线程所带来的系统 ... -
Java ThreadLocal使用浅析
2013-07-18 14:36 483ThreadLocal通过在其内部保存变量的副本,并且各个副本 ... -
MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
2013-07-05 13:06 1177http://blog.csdn.net/zhangwei ... -
分享一位网友的架构杂谈
2013-05-20 23:16 913不容类型的网站,并发处理不一样,例如针对sns这种类型的网站 ... -
JSP页面静态化
2013-04-08 09:20 890http://www.java-zone.org/644.ht ... -
Java compile to C++
2013-03-19 14:53 507http://code.google.com/a/eclips ... -
几个TCP Socket的通信框架
2013-03-19 12:26 996http://www.oschina.net/p/simple ... -
宝贝鱼
2013-03-18 23:54 692http://code.google.com/p/cshbbr ... -
将Java程序注册成系统服务(NT服务)
2013-03-16 16:14 604http://blog.csdn.net/small____f ... -
Java内存回收机制
2013-03-13 15:47 814http://www.iteye.com/blogs/tag/ ... -
支付宝,百付宝集成
2013-03-13 14:01 975http://help.alipay.com/support/ ... -
SSH+EXTJS项目下载
2013-03-11 23:02 437http://download.csdn.net/tag/Ex ... -
Hibernate中使用Threadlocal创建线程安全的Session
2013-03-04 20:39 592http://blog.sina.com.cn/s/blog_ ... -
Java Socket多线程通信
2012-10-09 09:53 839当Server没接受到一个Client连接请求之后,都把处理流 ... -
Java 多线程的一个例子
2012-10-09 09:48 1024目录: 1 synchronized的 ... -
app引擎
2012-07-10 09:39 0http://sae.sina.com.cn/ htt ...
相关推荐
- **虚拟代理**:用于控制资源的访问,如图像加载或大文件读取,通过代理对象先展示占位符,再在后台加载实际资源。 - **远程代理**:代理远程服务器的对象,使得客户端可以像操作本地对象一样操作远程对象,例如...
这时我们可以采用虚拟代理模式,即在用户真正需要查看图像之前,仅加载图像的缩略图,而真正的图像只有在用户明确请求时才加载。 #### 推荐资源 为了深入学习和理解代理模式及其在C#中的应用,可以参考以下资源: ...
虚拟网卡驱动安装失败. 基于虚拟网卡的代理模式将无法使用.
代理模式主要有三种类型:虚拟代理、远程代理和保护代理。虚拟代理常用于对象创建开销较大的场景,如大图加载时先显示小图或占位符;远程代理则用来为跨越网络的远程对象提供本地代表,隐藏远程调用的复杂性;保护...
**设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...
代理模式(Proxy) 定义: 为其他对象提供一种代理以控制对这个对象的访问 结构: 由三部分组成 1.RealSubject(真实对象): 真正会调用到的对象 2.Proxy(代理对象): 代理真实对象的地方 3.Subject(共同点): 代理对象...
#### 三、虚拟代理模式的核心概念 在虚拟代理模式中,主要包括以下三个核心组成部分: 1. **Subject**(主题):这是接口或者抽象类,定义了真实对象和代理对象共同的行为。 2. **RealSubject**(真实主题):实现...
在提供的资源中,你将找到三个目录,分别对应上述三种代理模式: - **jdkProxy**:这个目录包含了使用JDK动态代理的例子。你可以看到一个或多个接口,一个实现了该接口的目标类,以及一个实现了InvocationHandler...
在代理模式中,通常有三个关键角色: 1. 目标对象(RealSubject):代理模式所要控制的对象,实现了与客户端相同的接口,是代理对象所代表的实际对象。 2. 代理对象(Proxy):实现了与目标对象相同的接口,持有目标...
在代理模式中,主要有三个角色: 1. **真实对象(Real Subject)**:这是代理模式所代理的对象,它实现了与代理对象相同的接口,是实际执行操作的对象。 2. **代理对象(Proxy)**:代理真实对象,它与真实对象具有...
1. **虚拟代理**:当目标对象加载成本较高时,如大图片、视频等,虚拟代理可以在真实对象被创建之前先提供一个占位符,等到真正需要时再加载真实对象。 2. **远程代理**:这种代理模式用于处理远程对象,例如在网络...
代理模式是一种常用的设计模式,它在软件开发中扮演着重要的角色,特别是在iOS平台的应用程序设计中。代理模式的核心思想是为一个对象提供一个替身或代理,以控制对这个对象的访问。这种模式允许我们通过代理来间接...
代理模式的基本结构包括三个主要角色:真实主题(RealSubject)、代理(Proxy)和客户端(Client)。真实主题是代理所代表的对象,它实现了与客户端交互所需的接口。代理类则实现了相同的接口,但其内部包含了一个...
在代理模式中,有三个关键角色: 1. **原始对象(Real Subject)**:这是代理模式所代理的真实对象,它实现了与代理对象相同的接口,以便于代理对象可以在任何需要的地方代替它。 2. **代理对象(Proxy)**:代理...
在代理模式中,有三个关键角色:真实目标(Real Subject)、代理(Proxy)和客户端(Client)。真实目标是代理所代表的对象,它执行实际的工作。代理则扮演真实目标的替身,它持有对真实目标的引用,并且在客户端与...
代理模式分为三种类型:远程代理、虚拟代理和保护代理。在远程代理中,代理对象位于客户端,而原始对象位于远程服务器;虚拟代理则是在需要时才创建或加载原始对象,以提高性能;保护代理则用于控制对对象的访问权限...
**设计模式实现——代理模式** 在软件工程中,设计模式是一种通用可重用的解决方案,它描述了在特定上下文中经常出现的问题以及该问题的解决方案。代理模式是设计模式的一种,它提供了一种对目标对象的间接访问方式...
在代理模式中,主要有三个角色: 1. **目标对象(Target)**:这是被代理的对象,它定义了原始业务逻辑。 2. **代理对象(Proxy)**:代理对象与目标对象有相同的接口,它负责控制对目标对象的访问,并可以添加额外...
代理模式分为两种主要类型:虚拟代理和动态代理。这两种代理方式在实际开发中都有广泛的应用。 虚拟代理通常用于延迟加载或者缓存。例如,当需要加载一个大图片时,我们可以先用一个小的占位符(如loading图)作为...
代理模式主要分为三种类型:虚拟代理、保护代理和远程代理。 **代理模式的工作原理** 代理模式的核心在于代理对象持有对目标对象的引用,并通过代理对象调用目标对象的方法。这样做的好处是可以在不修改目标对象的...