`
starbhhc
  • 浏览: 649421 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

代理模式-虚拟代理

阅读更多
[环境]:StarUML5.0 + JDK6

虚拟代理:




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:


分享到:
评论

相关推荐

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

    代理模式分为三种类型:远程代理、虚拟代理和保护代理。在远程代理中,代理对象位于客户端,而原始对象位于远程服务器;虚拟代理则是在需要时才创建或加载原始对象,以提高性能;保护代理则用于控制对对象的访问权限...

    设计模式--代理模式

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

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

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

    设计模式-代理模式

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

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

    1. **虚拟代理**:当目标对象加载或创建成本较高时,可以先用一个占位符(代理)代替,等到真正需要时再加载或创建目标对象。 2. **远程代理**:用于处理远程访问,使得客户端可以像操作本地对象一样操作远程对象。 ...

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

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

    设计模式之代理模式proxy

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

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

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

    java中的三种代理模式

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

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

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

    设计模式之代理模式Proxy

    代理模式主要有三种类型:虚拟代理、远程代理和保护代理。虚拟代理常用于对象创建开销较大的场景,如大图加载时先显示小图或占位符;远程代理则用来为跨越网络的远程对象提供本地代表,隐藏远程调用的复杂性;保护...

    设计模式之代理模式demo

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

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

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

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

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

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

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

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

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

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

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

    代理模式 C++实现

    2.虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。 3.安全代理,用来控制真实对象访问时的权限。 4.智能指引,是指当调用真实对象时,代理处理另外一些事 特殊理解: 代理...

    代理模式(代码)

    在实际应用中,代理模式有多种类型,包括远程代理、虚拟代理、保护代理、缓存代理等。例如: 1. 远程代理:当真实对象在远程服务器上时,远程代理作为本地的代表,处理客户端的请求并转发到远程对象,使得客户端...

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

    2. **虚拟代理**:在对象创建需要花费大量资源的情况下,代理对象可以先返回一个简单的占位符,之后在需要时再创建真实对象,达到延迟加载的目的。 3. **安全代理**:代理对象可以用来控制对原始对象的访问权限,...

Global site tag (gtag.js) - Google Analytics