`

[原]代理模式-虚拟代理

阅读更多

[关键字]: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);
        }
    }
}


运行结果:
Loading icon...


Loaded successfully:

  • 大小: 53.5 KB
分享到:
评论

相关推荐

    设计模式专题之(六)代理模式---设计模式代理模式示例代码(python--c++)

    首先,代理模式的核心思想是为一个对象提供一个替身或代理,以便增加新的功能或控制对原对象的访问。代理模式分为三种类型:远程代理、虚拟代理和保护代理。在远程代理中,代理对象位于客户端,而原始对象位于远程...

    设计模式--代理模式

    代理模式是一种常用的设计模式,它在软件开发中扮演着重要角色,允许我们通过一个代理类来控制对原对象的访问。在《设计模式:可复用面向对象软件的基础》(通常称为GoF设计模式)中,代理模式被定义为“为其他对象...

    设计模式-代理模式

    1. **虚拟代理**:当目标对象创建开销较大时,代理对象先创建,之后在需要时才创建目标对象。 2. **保护代理**:限制对目标对象的访问,比如权限检查。 3. **远程代理**:为远程对象提供本地接口,使得客户端可以像...

    2 代理模式-MOOC课程内容.pdf

    代理模式是软件设计中的一种行为型模式,属于结构型模式的范畴。它是为了控制对一个对象的访问,从而提供一个代理或者占位符来代替原始对象。该模式的主要目的是为其他对象提供一种代理以控制对这个对象的访问。 ...

    2 代理模式-课程内容.rar

    代理模式的核心思想是为一个对象提供一个代理,这个代理对象作为原对象的替代品,可以控制对原对象的访问,或者在调用原对象的基础上增加额外的功能。代理可以在客户端和目标对象之间起到中介的作用,它可以实现如...

    虚拟网卡驱动安装失败. 基于虚拟网卡的代理模式将无法使用.

    虚拟网卡驱动安装失败. 基于虚拟网卡的代理模式将无法使用.

    设计模式之代理模式proxy

    **设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...

    c#代码介绍23种设计模式-13代理模式(附代码)

    3)Copy-on-Write代理:虚拟代理的一种,把复制(或者叫克隆)拖延到只有在客户端需要时,才真正采取行动。 4)保护(Protect or Access)代理:控制一个对象的访问,可以给不同的用户提供不同级别的使用权限。 5)...

    设计模式之代理模式Proxy

    代理模式是设计模式中的一种结构型模式,它在对象交互中起到了中介的作用,允许通过代理对象来控制对原对象的访问。代理模式的核心思想是为一个对象提供一个替身,以便增加新的功能或者控制对原对象的访问。这种模式...

    java中的三种代理模式

    代理模式通常用于增加额外的功能,如日志、权限检查等,或者为了创建虚拟代理以提高性能。以下是Java中的三种代理模式的详细说明: 1. **静态代理** 静态代理是最基础的代理方式,它需要程序员手动创建目标对象的...

    JAVA设计模式例程-代理模式

    - **虚拟代理**:用于延迟加载大对象或耗时操作,如图片加载或计算密集型任务。 - **安全代理**:用于控制对目标对象的访问权限,例如进行权限检查。 - **智能引用**:提供额外的信息,如对象的状态,或者在访问...

    设计模式实现——代理模式

    - **虚拟代理**:延迟加载大对象,如图像、视频等,先加载小的代理对象,需要时再加载实际的大对象。 - **安全代理**:控制对目标对象的访问权限,进行权限检查。 - **智能引用**:除了保持对目标对象的引用外,还...

    代理模式(Proxy Pattern) 1. 概述 1.1 基本概念 1.2 为什么需要代理模式 1.3 代理模式的四个角色 2. 代理模式的类型 2.1 静态代理 2.2 JDK动态代理

    7.2 虚拟代理(Virtual Proxy) 7.3 保护代理(Protection Proxy) 7.4 缓存代理(Cache Proxy) 7.5 智能引用(Smart Reference) 8. 代理模式的优缺点总结 8.1 优点 8.2 缺点 9. 常见问题与解答 9.1 为什么要使用...

    设计模式之代理模式demo

    - **虚拟代理**:在真实对象创建开销较大时,代理对象可以先创建,然后在需要时再创建真实对象,如图片预加载。 - **保护代理**:控制对真实对象的访问权限,例如在访问敏感资源时进行身份验证。 - **缓存代理**:在...

    Java设计模式之代理模式(结构)

    实现虚拟代理 ```java public class VirtualProxy extends IDEOperation { private RealProcessor realProcessor; @Override public void generateDocs(String javaFile) { if (realProcessor == null) { ...

    Simpana-V10-虚拟化系统保护(201806)

    Simpana-V10针对虚拟化环境提供了全面的数据保护方案,涵盖了多种虚拟化平台和备份模式。通过灵活的配置选项和丰富的功能集,该方案能够满足不同企业的多样化需求。无论是对于小型企业还是大型组织,Simpana-V10都能...

    结构型模式之代理模式(Proxy)

    2. 虚拟代理:当目标对象创建开销较大时,代理对象可以在需要时才创建或加载目标对象,例如图片预加载或大文件读取。 3. 安全代理:代理对象可以用于控制对真实对象的访问权限,比如只有经过认证的用户才能访问某些...

    设计模式C++学习之代理模式(Proxy)

    1. **虚拟代理**:当目标对象加载成本较高时,如大图片、视频等,虚拟代理可以在真实对象被创建之前先提供一个占位符,等到真正需要时再加载真实对象。 2. **远程代理**:这种代理模式用于处理远程对象,例如在网络...

    代理模式Demo代理模式代理模式Demo

    代理模式的核心思想是为一个对象提供一个代理,使得代理对象可以在不改变原有对象行为的前提下,增加额外的功能或者控制原对象的访问。这种模式可以用于延迟加载、安全控制、统计分析等多种场景。 在代理模式中,有...

    面向对象23种设计模式之代理模式

    - **虚拟代理**:当加载真实对象需要大量资源时,代理对象可以在需要时才加载真实对象,提高程序性能。 - **安全代理**:用于控制对真实对象的访问权限,例如,只有经过认证的用户才能通过代理访问对象。 - **缓存...

Global site tag (gtag.js) - Google Analytics