`

代理模式Image Proxies(二、最朴素实现)

 
阅读更多

在前面《 代理模式Image Proxies(一、最朴素实现) 》中,代理类如下:

package com.oozinoz.imaging;

/*
 * Copyright (c) 2001, 2005. Steven J. Metsker.
 * 
 * Steve Metsker makes no representations or warranties about
 * the fitness of this software for any particular purpose, 
 * including the implied warranty of merchantability.
 *
 * Please use this software as you wish with the sole
 * restriction that you may not claim that you wrote it.
 */

import java.awt.*;
import javax.swing.*;

/**
 * This class acts as a proxy for another ImageIcon. In "The Design Patterns
 * in Java" we wind up tearing out this class, preferring the techniques
 * used in the ImageIconLoader class.
 * @author Steven J. Metsker
 * @see LoadingImageIcon
 */
public class ImageIconProxy extends ImageIcon implements Runnable {
    static final ImageIcon ABSENT = new ImageIcon(ClassLoader.getSystemResource("images/absent.jpg"));
    static final ImageIcon LOADING = new ImageIcon(ClassLoader.getSystemResource("images/loading.jpg"));
    ImageIcon current = ABSENT;
    protected String filename;
    protected JFrame callbackFrame;

    /**
     * Construct an ImageIconProxy that will (on demand) load the image in the
     * provided file.
     * @param filename the name of a file to load
     */
    public ImageIconProxy(String filename) {
        super(ABSENT.getImage());
        this.filename = filename;
    }

    /**
     * Load the desired image and call back the provided frame when done.
     * @param JFrame the frame to repaint when the image is loaded
     */
    public void load(JFrame callbackFrame) {
        this.callbackFrame = callbackFrame;
        current = LOADING;
        callbackFrame.repaint();
        new Thread(this).start();
    }

    /**
     * Load the desired image (presumably in a separate thread).
     */
    public void run() {
        current = new ImageIcon(ClassLoader.getSystemResource(filename));
        callbackFrame.pack();
    }
    
    /**
     * @return the height of the Icon
     */
    public int getIconHeight() {
        return current.getIconHeight();
    }

    /**
     * @return the width of the Icon
     */
    public int getIconWidth() {
        return current.getIconWidth();
    }

    /**
     * Paint the Icon
     */
    public synchronized void paintIcon(Component c, Graphics g, int x, int y) {
        current.paintIcon(c, g, x, y);
        System.out.println("paintIcon()");
    }
}

 

   其中,后面三个方法getIconHeight()、getIconWidth()、paintIcon(...)都是在覆盖父类ImageIcon的方法,下面的改进主要目的在于:

   “不把绘图请求转发给父类ImageIcon对象,而是直接操作ImageIcon中的Image对象,更加简便”。(注意到一个ImageIcon对象内部封装了一个Image对象,在ImageIcon构造函数就可以看出,另外ImageIcon类还有setImage()方法)

   改进后有两个类:ShowLoader和LoadingImageIcon,其中后者是代理。当前者在内部调用loader.load(frame);时,后者会更换自己内部的图片,重新显示窗口。具体代码见附件。

 

分享到:
评论

相关推荐

    代理模式Image Proxies(一、最朴素实现)

    在本文中,我们将探讨代理模式的最朴素实现,并通过Java代码示例进行讲解。 代理模式的核心思想是为一个对象提供一个替代品或占位符,以便控制对原对象的访问。这可以用于添加额外的功能,如缓存、日志记录、权限...

    代理模式Remote Proxies(三、RMI)

    代理模式在软件设计中是一种常用的设计模式,它允许我们为一个对象提供一个替代品或占位符,以便控制对真实对象的访问。在远程方法调用(Remote Method Invocation,RMI)场景下,代理模式的应用尤为突出。RMI是Java...

    proxies_chi.zip

    标题"proxies_chi.zip"和描述中提到的内容是关于创建一个代理IP池的Python项目,这个项目能够自动从网络上抓取IP地址,检查它们的可用性,并将这些信息存储到数据库中,以便后续使用。这涉及到网络爬虫、IP验证、...

    Laravel开发-laravel-valid-proxies

    在Laravel框架中,"laravel-valid-proxies"通常指的...在实际开发中,正确配置和使用`laravel-valid-proxies`可以帮助开发者解决因代理而产生的各种问题,如防止恶意请求,以及在多层代理环境中正确识别客户端IP地址。

    c#动态代理

    .NET Framework提供了两种主要的动态代理实现方式: 1. **System.Reflection.Emit**:这是.NET Framework提供的IL(中间语言)生成API,可以直接在运行时动态地构建类型。通过Emit API,我们可以生成包含代理逻辑的...

    Python实现 windows 下代理IP的自动切换

    本文将详细介绍如何使用Python在Windows环境下实现代理IP的自动切换功能。 首先,理解代理IP的基本概念:代理IP是通过一个中间服务器(即代理服务器)转发网络请求,使得请求的目标网站看到的不再是你的真实IP,...

    koa-proxies:koa@2.x代理中间件

    Koa代理 middlware HTTP代理 由提供支持。 安装 $ npm install koa-proxies --save 选件 http-proxy活动 options . events = { error ( err , req , res ) { } , proxyReq ( proxyReq , req , res ) { } , ...

    python中requests使用代理proxies方法介绍

    如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求: import requests proxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080", } requests.get(...

    用Proxies实现对象撤消使重做和更改历史记录

    为实现这一功能,开发者常常利用设计模式来辅助,其中一种常用的方法是使用"代理"(Proxies)。本文将详细探讨如何通过JavaScript的Proxy对象来实现对象撤消/重做以及记录更改历史。 首先,让我们理解什么是Proxy。...

    Java Networking and Proxies Code

    在Java编程领域,网络通信和代理(Proxies)是重要的组成部分,特别是在开发需要跨网络进行数据交换的应用时。本文将详细解析"Java Networking and Proxies Code"这一主题,包括如何启动一个线程来检查URL是否通过...

    Python库 | proxies_l-0.0.3.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:proxies_l-0.0.3.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Laravel开发-laravel-valid-proxies .zip.zip

    你可以定义哪些IP地址或代理服务器白名单,甚至实现复杂的验证逻辑,如检查代理服务器的证书或连接到代理服务器进行身份验证。 6. **日志与调试**:为了便于调试和监控,`laravel-valid-proxies`可能提供日志功能,...

    python3爬取快代理免费代理ip并多线程验证

    这通常通过向某个网站发送带有代理设置的请求来实现。Python的`requests`库支持设置代理,我们可以使用`proxies`参数。 3. **验证代理IP**: - 设置代理:`proxies = {'http': 'http://ip:port', '...

    Delphi_Proxy_Scraper.zip_Proxies

    标题中的"Delphi_Proxy_Scraper.zip_Proxies"暗示了这是一个使用Delphi编程语言编写的代理服务器抓取程序。Delphi是一种基于Object Pascal的集成开发环境(IDE),常用于创建桌面应用程序。在这个项目中,开发者可能...

    Csharp设计模式

    在C#中,可以使用虚方法、抽象类或接口实现静态代理,或者利用.NET的`System.Runtime.Remoting.Proxies`命名空间实现动态代理。 9. **适配器模式(Adapter)**:将一个类的接口转换成客户希望的另一个接口。适配器...

    Proxy is a high performance HTTPS proxies SOCKS5 proxiesWEB.zip

    用户通过浏览器配置代理服务器,所有的网页请求都会通过这个服务器转发,同样可以实现匿名浏览和访问受限的网站。但是,WEB代理通常不支持非HTTP协议的服务,比如邮件、FTP等。 压缩包内的文件 "说明.txt" 可能包含...

    scrapy-rotating-proxies:与Scrapy一起使用多个代理

    安装pip install scrapy-rotating-proxies用法将带有代理列表的ROTATING_PROXY_LIST选项添加到settings.py: ROTATING_PROXY_LIST = [ 'proxy1.com:8000', 'proxy2.com:8031', # ...]或者,您可以指定一个ROTATING_...

    ip代理采集和本地切换ip代理上网

    在IT行业中,网络访问有时需要通过IP代理来实现,特别是在数据爬取、网络安全测试或跨国访问受限内容时。本文将详细讲解"IP代理采集"和"本地切换IP代理上网"的相关知识点。 首先,我们理解一下IP代理的基本概念。IP...

    Mysql 5.7.18 利用MySQL proxies_priv实现类似用户组管理

    在MySQL 5.7.18版本中,为了实现类似用户组管理的机制,我们可以利用`proxies_priv`这一特性来模拟角色(Role)的功能。角色在数据库管理系统中通常用于批量授予用户相同的一组权限,简化权限管理。在MySQL 5.7.X...

Global site tag (gtag.js) - Google Analytics