虚拟代理

加载延缓
     
相信绝大多数人都见到过这样一种情况,一个系统需要加载一个模块,但此模块的加载需要耗费相当长的时间,因此系统需要显示一段“正在加载”的信息,同时将模块加载。模块加载后,系统将“正在加载”的文字或图片去掉,并启动模块。有时候加载图像也会造成一定的延迟,因此系统需要在放置图像的地方显示一段文字信息,请用户等待。系统会在另一个线程中加载图片,一旦加载完成就将等待信息换成该图像。这种做法叫做加载延缓,是一种比较友好的用户界面的设计方案。
虚拟代理模式的应用
       
当一个真实主题对象的加载需要消耗资源时,一个虚拟代理对象可以代理真实对象接受请求。一旦接受到请求,代理对象马上显示出“正在加载”的信息,并在真实主题加载完成时,加载真实主题对象,也就是模块或图像。
       
系统的要求
       
一个加载图像的例子,由于图像的加载会消耗一定的资源,因此要求设计一个虚拟代理对象,以代替图像对象接受客户端的请求。当虚拟代理对象接到请求后,会按照预定的逻辑首先显示一段等待信息,然后在另一个线程中加载图像。当
图像加载完成后,主线程会决定将图片显示出来。
系统的设计
       
系统由一个JFrame对象、一个Icon对象以及此Icon对象的虚拟代理对象组成。
系统的时序
       
系统的客户端对象调用代理对象ImageIconProxy对象,而此代理则负责将调用传递给真实主题角色,即一个ImageIcon对象。系统的客户端对象调用代理ImageIconProxy对象时,才代理对象调用所传入的Graphics对象的drawRec()方法,显示一段“正在加载”的等待信息。然后代理对象创建一个内部线程对象,并将之传入SwingUtilities的invokeLater()方法中,让它负责加载真实主题。至此,代理对象成功延迟了真实主题的加载。随后,当真实主题加载完成后,再将真实主题显示出来。

系统源代码如下:
 
代理角色:ImageIconProxy.java  
 
package com.design.mode.vmwareproxy;


/**
 * 代理角色
 * */
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 Jeff Yan ,Ph.D", x+20, y+370);
		}else{
			g.drawRect(x, y, width-1, height-1);
			g.drawString("正在加载,请稍等...", 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(Exception ex){
							ex.printStackTrace();
						}
						//当图像被加载后,重新描绘视窗构件
						c.repaint();
					}
				});
			}
		}
	}

}
客户端代码 Client.java
package com.design.mode.vmwareproxy;


/**
 * 
 * 客户端代码
 * */
import java.awt.Graphics;
import java.awt.Insets;

import javax.swing.Icon;
import javax.swing.JFrame;

public class Client extends JFrame {
	
	private static int IMAGE_WIDTH = 270;
	private static int IMAGE_HEIGHT= 380;
	private Icon imageIconProxy = null;
	
	
	//构造子函数
	public Client(){
		super("Virtual Proxy Client");
		imageIconProxy =  new ImageIconProxy("d:/hongyan.jpg", IMAGE_WIDTH, IMAGE_HEIGHT);
		setBounds(100, 100, IMAGE_WIDTH+10, IMAGE_HEIGHT+30);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		
		Client app = new Client();
		app.show();
	}
	
	//置换掉java.awt.Container 的方法
	public void paint(Graphics g){
		super.paint(g);
		Insets insets = getInsets();
		imageIconProxy.paintIcon(this, g, insets.left, insets.top);
	}

}


       

    
 

转载于:https://my.oschina.net/gao0516/blog/138457

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值