- 浏览: 203520 次
- 性别:
- 来自: 芜湖
文章分类
- 全部博客 (139)
- 软件 (0)
- Pattern (6)
- CSDN导入 (19)
- Struts (3)
- [网站分类]1.网站首页原创 (27)
- [网站分类]6.转载区 (4)
- Hibernate (10)
- Error (8)
- [网站分类]2.Java新手区 (20)
- Java (8)
- [网站分类]4.其他技术区 (10)
- Web (1)
- C++ (2)
- Algorithm (4)
- Linux (2)
- Skill (1)
- Tech (2)
- Note (2)
- [网站分类]3.非技术区 (1)
- Database (1)
- Winty (7)
- [网站分类]1.网站首页原创Java技术区(对首页文章的要求: 原创、高质量、经过认真思考并精心写作。BlogJava管理团队会对首页的文章进行管理。) (0)
最新评论
-
haohao-xuexi02:
很不错哦。
O'Reilly cos上传组件的使用(1/3) - 上传文件 -
yoin528:
useUnicode=true&charact ...
[原]向MySQL数据库插入Blob数据的问题 -
xiaoqing20:
下载来看看!呵呵
[原]Struts2类型转换 -
xiaoqing20:
[原]Struts2类型转换
[关键字]:java,design pattern,设计模式,《Java与模式》学习,Proxy Pattern,代理模式
[环境]:StarUML5.0 + JDK6
[作者]:Winty (wintys@gmail.com) http://wintys.blogjava.net
[正文]:
虚拟代理:
package pattern.proxy.virtual;
import java.awt.Graphics;
import java.awt.Component;
import java.awt.Insets;
import java.awt.Container;
import javax.swing.JPanel;
import javax.swing.JOptionPane;
import javax.swing.ImageIcon;
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.Icon;
/**
* 虚拟代理
*
* 使用代理加载图片
*
* @version 2009-6-29
* @author Winty(wintys@gmail.com) http://wintys.blogjava.net
*/
public class VirtualProxyTest extends JFrame{
private final int WIDTH = 500;
private final int HEIGHT = 500;
public VirtualProxyTest(){
super("虚拟代理");
setContentPane(new MyPanel());
setSize(WIDTH , HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
VirtualProxyTest test = new VirtualProxyTest();
}
}
class MyPanel extends JPanel{
private IconProxy iconProxy;
public MyPanel(){
iconProxy = new IconProxy("sample.jpg" , 200 , 20);
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
iconProxy.paintIcon(this , g , 0 , 0);
}
}
class IconProxy implements Icon{
private Icon icon;
private String fileName;//Icon的文件名
private boolean done;//Icon是否加载完成
private final int STR_X;
private final int STR_Y;
/**
* @param fileName 图片文件
* @param str_x 字符串输出的x位置
* @param str_y 字符串输出的y位置
*/
public IconProxy(String fileName , int str_x , int str_y){
icon = null;
this.fileName = fileName;
done = false;
STR_X = str_x;
STR_Y = str_y;
}
@Override
public int getIconHeight(){
return icon.getIconHeight();
}
@Override
public int getIconWidth(){
return icon.getIconWidth();
}
@Override
public void paintIcon(final Component c, Graphics g, int x, int y){
//因为JFrame的标题栏和边框占据了空间,
//而paintIcon是从容器的(0,0)坐标开始绘制,所以要计算边框所占的空间。
Insets inset = new Insets(0,0,0,0);
if(c instanceof Container)
inset = ((Container)c).getInsets();
if(!done){//未加载完成
g.drawString("Loading icon...",
inset.right + STR_X ,
inset.top + STR_Y);
synchronized(this){
SwingUtilities.invokeLater(
new Runnable(){
public void run(){
//延时
try{
Thread.sleep(5*1000);
}catch(InterruptedException e){
JOptionPane.showMessageDialog(c , e.getMessage());
}
icon = new ImageIcon(fileName);
done = true;
c.repaint();
}
}
);
}//end of synchronized
}
else{//加载完成
g.drawString("Loaded successfully.",
inset.right + STR_X ,
inset.top + STR_Y);
//空出长度为STR_Y的空间给String
icon.paintIcon(c , g , x + inset.right , y + inset.top + STR_Y + 5);
}
}
}
import java.awt.Graphics;
import java.awt.Component;
import java.awt.Insets;
import java.awt.Container;
import javax.swing.JPanel;
import javax.swing.JOptionPane;
import javax.swing.ImageIcon;
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.Icon;
/**
* 虚拟代理
*
* 使用代理加载图片
*
* @version 2009-6-29
* @author Winty(wintys@gmail.com) http://wintys.blogjava.net
*/
public class VirtualProxyTest extends JFrame{
private final int WIDTH = 500;
private final int HEIGHT = 500;
public VirtualProxyTest(){
super("虚拟代理");
setContentPane(new MyPanel());
setSize(WIDTH , HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
VirtualProxyTest test = new VirtualProxyTest();
}
}
class MyPanel extends JPanel{
private IconProxy iconProxy;
public MyPanel(){
iconProxy = new IconProxy("sample.jpg" , 200 , 20);
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
iconProxy.paintIcon(this , g , 0 , 0);
}
}
class IconProxy implements Icon{
private Icon icon;
private String fileName;//Icon的文件名
private boolean done;//Icon是否加载完成
private final int STR_X;
private final int STR_Y;
/**
* @param fileName 图片文件
* @param str_x 字符串输出的x位置
* @param str_y 字符串输出的y位置
*/
public IconProxy(String fileName , int str_x , int str_y){
icon = null;
this.fileName = fileName;
done = false;
STR_X = str_x;
STR_Y = str_y;
}
@Override
public int getIconHeight(){
return icon.getIconHeight();
}
@Override
public int getIconWidth(){
return icon.getIconWidth();
}
@Override
public void paintIcon(final Component c, Graphics g, int x, int y){
//因为JFrame的标题栏和边框占据了空间,
//而paintIcon是从容器的(0,0)坐标开始绘制,所以要计算边框所占的空间。
Insets inset = new Insets(0,0,0,0);
if(c instanceof Container)
inset = ((Container)c).getInsets();
if(!done){//未加载完成
g.drawString("Loading icon...",
inset.right + STR_X ,
inset.top + STR_Y);
synchronized(this){
SwingUtilities.invokeLater(
new Runnable(){
public void run(){
//延时
try{
Thread.sleep(5*1000);
}catch(InterruptedException e){
JOptionPane.showMessageDialog(c , e.getMessage());
}
icon = new ImageIcon(fileName);
done = true;
c.repaint();
}
}
);
}//end of synchronized
}
else{//加载完成
g.drawString("Loaded successfully.",
inset.right + STR_X ,
inset.top + STR_Y);
//空出长度为STR_Y的空间给String
icon.paintIcon(c , g , x + inset.right , y + inset.top + STR_Y + 5);
}
}
}
运行结果:
Loading icon...
Loaded successfully:
发表评论
-
[原]导出CodeHelp的数据
2009-03-16 17:05 859搬到blogjava总得发点原创的东西吧。 Code ... -
[原]使用Ant实现zip压缩解压功能
2009-03-19 13:17 1721[关键词]:ant,zip,unzip,Apache,压缩,解 ... -
[原]EL函数的使用
2009-04-03 21:29 1120[标题]:EL函数的使用 [时 ... -
[原]对Class.getMethod()的调用未经检查
2009-04-05 15:52 2365[标题]:对Class.getMethod()的调用未经检查 ... -
[原]JNI简单示例
2009-04-05 21:33 1039[标题]:JNI简单示例 [时 ... -
[原]简单工厂模式
2009-04-14 12:26 755[关键字]:java,设计模式,简单工厂,《java与模式》 ... -
[原]工厂模式
2009-04-14 12:32 734[关键字]:java,design pattern,设计模式, ... -
[原]抽象工厂模式
2009-04-14 19:25 759[关键字]:java,design pattern,设计模式, ... -
[原]方法返回值为数组的另一种表示方法
2009-04-25 22:28 977[时间]:2009-04-25 今天看到JDK的源代码 ... -
[原]SAX使用示例
2009-04-26 19:18 2053[标题]:[原]SAX使用示例 [时间]:2009-4-25 ... -
[原]责任链模式
2009-05-09 16:47 737[关键字]:java,design pattern,设计模式, ... -
[原]状态模式
2009-05-18 23:03 839[关键字]:java,design pattern,设计模式, ... -
[原]策略模式
2009-05-21 22:21 706[关键字]:java,design pattern,设计模式, ... -
[原]VC实现重启路由器
2009-05-29 23:36 2082[标题]:[原]VC实现重启路 ... -
[原]远程登录Windows Server 2003的当前会话
2009-06-01 11:19 2075[标题]:远程登录Windows Server 2003的当前 ... -
[原]Tomcat crossContext
2009-06-01 12:27 6103[标题]:Tomcat crossContext [时间]:2 ... -
[原]装饰模式1
2009-06-07 22:33 716[关键字]:java,design pattern,设计模式, ... -
[原]装饰模式3-Grep
2009-06-07 22:42 700[关键字]:java,design pattern,设计模式, ... -
[原]合成模式-透明的
2009-06-08 22:23 765[关键字]:java,design pattern,设计模式, ... -
[原]合成模式-安全的
2009-06-08 22:27 840[关键字]:java,design pattern,设计模式, ...
相关推荐
首先,代理模式的核心思想是为一个对象提供一个替身或代理,以便增加新的功能或控制对原对象的访问。代理模式分为三种类型:远程代理、虚拟代理和保护代理。在远程代理中,代理对象位于客户端,而原始对象位于远程...
代理模式是一种常用的设计模式,它在软件开发中扮演着重要角色,允许我们通过一个代理类来控制对原对象的访问。在《设计模式:可复用面向对象软件的基础》(通常称为GoF设计模式)中,代理模式被定义为“为其他对象...
1. **虚拟代理**:当目标对象创建开销较大时,代理对象先创建,之后在需要时才创建目标对象。 2. **保护代理**:限制对目标对象的访问,比如权限检查。 3. **远程代理**:为远程对象提供本地接口,使得客户端可以像...
代理模式是软件设计中的一种行为型模式,属于结构型模式的范畴。它是为了控制对一个对象的访问,从而提供一个代理或者占位符来代替原始对象。该模式的主要目的是为其他对象提供一种代理以控制对这个对象的访问。 ...
代理模式的核心思想是为一个对象提供一个代理,这个代理对象作为原对象的替代品,可以控制对原对象的访问,或者在调用原对象的基础上增加额外的功能。代理可以在客户端和目标对象之间起到中介的作用,它可以实现如...
虚拟网卡驱动安装失败. 基于虚拟网卡的代理模式将无法使用.
**设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...
3)Copy-on-Write代理:虚拟代理的一种,把复制(或者叫克隆)拖延到只有在客户端需要时,才真正采取行动。 4)保护(Protect or Access)代理:控制一个对象的访问,可以给不同的用户提供不同级别的使用权限。 5)...
代理模式是设计模式中的一种结构型模式,它在对象交互中起到了中介的作用,允许通过代理对象来控制对原对象的访问。代理模式的核心思想是为一个对象提供一个替身,以便增加新的功能或者控制对原对象的访问。这种模式...
代理模式通常用于增加额外的功能,如日志、权限检查等,或者为了创建虚拟代理以提高性能。以下是Java中的三种代理模式的详细说明: 1. **静态代理** 静态代理是最基础的代理方式,它需要程序员手动创建目标对象的...
- **虚拟代理**:用于延迟加载大对象或耗时操作,如图片加载或计算密集型任务。 - **安全代理**:用于控制对目标对象的访问权限,例如进行权限检查。 - **智能引用**:提供额外的信息,如对象的状态,或者在访问...
- **虚拟代理**:延迟加载大对象,如图像、视频等,先加载小的代理对象,需要时再加载实际的大对象。 - **安全代理**:控制对目标对象的访问权限,进行权限检查。 - **智能引用**:除了保持对目标对象的引用外,还...
- **虚拟代理**:在真实对象创建开销较大时,代理对象可以先创建,然后在需要时再创建真实对象,如图片预加载。 - **保护代理**:控制对真实对象的访问权限,例如在访问敏感资源时进行身份验证。 - **缓存代理**:在...
实现虚拟代理 ```java public class VirtualProxy extends IDEOperation { private RealProcessor realProcessor; @Override public void generateDocs(String javaFile) { if (realProcessor == null) { ...
Simpana-V10针对虚拟化环境提供了全面的数据保护方案,涵盖了多种虚拟化平台和备份模式。通过灵活的配置选项和丰富的功能集,该方案能够满足不同企业的多样化需求。无论是对于小型企业还是大型组织,Simpana-V10都能...
2. 虚拟代理:当目标对象创建开销较大时,代理对象可以在需要时才创建或加载目标对象,例如图片预加载或大文件读取。 3. 安全代理:代理对象可以用于控制对真实对象的访问权限,比如只有经过认证的用户才能访问某些...
1. **虚拟代理**:当目标对象加载成本较高时,如大图片、视频等,虚拟代理可以在真实对象被创建之前先提供一个占位符,等到真正需要时再加载真实对象。 2. **远程代理**:这种代理模式用于处理远程对象,例如在网络...
代理模式的核心思想是为一个对象提供一个代理,使得代理对象可以在不改变原有对象行为的前提下,增加额外的功能或者控制原对象的访问。这种模式可以用于延迟加载、安全控制、统计分析等多种场景。 在代理模式中,有...
- **虚拟代理**:当加载真实对象需要大量资源时,代理对象可以在需要时才加载真实对象,提高程序性能。 - **安全代理**:用于控制对真实对象的访问权限,例如,只有经过认证的用户才能通过代理访问对象。 - **缓存...
2.虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。 3.安全代理,用来控制真实对象访问时的权限。 4.智能指引,是指当调用真实对象时,代理处理另外一些事 特殊理解: 代理...