在前面《 代理模式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);时,后者会更换自己内部的图片,重新显示窗口。具体代码见附件。
分享到:
相关推荐
在本文中,我们将探讨代理模式的最朴素实现,并通过Java代码示例进行讲解。 代理模式的核心思想是为一个对象提供一个替代品或占位符,以便控制对原对象的访问。这可以用于添加额外的功能,如缓存、日志记录、权限...
代理模式在软件设计中是一种常用的设计模式,它允许我们为一个对象提供一个替代品或占位符,以便控制对真实对象的访问。在远程方法调用(Remote Method Invocation,RMI)场景下,代理模式的应用尤为突出。RMI是Java...
标题"proxies_chi.zip"和描述中提到的内容是关于创建一个代理IP池的Python项目,这个项目能够自动从网络上抓取IP地址,检查它们的可用性,并将这些信息存储到数据库中,以便后续使用。这涉及到网络爬虫、IP验证、...
在Laravel框架中,"laravel-valid-proxies"通常指的...在实际开发中,正确配置和使用`laravel-valid-proxies`可以帮助开发者解决因代理而产生的各种问题,如防止恶意请求,以及在多层代理环境中正确识别客户端IP地址。
.NET Framework提供了两种主要的动态代理实现方式: 1. **System.Reflection.Emit**:这是.NET Framework提供的IL(中间语言)生成API,可以直接在运行时动态地构建类型。通过Emit API,我们可以生成包含代理逻辑的...
本文将详细介绍如何使用Python在Windows环境下实现代理IP的自动切换功能。 首先,理解代理IP的基本概念:代理IP是通过一个中间服务器(即代理服务器)转发网络请求,使得请求的目标网站看到的不再是你的真实IP,...
Koa代理 middlware HTTP代理 由提供支持。 安装 $ npm install koa-proxies --save 选件 http-proxy活动 options . events = { error ( err , req , res ) { } , proxyReq ( proxyReq , req , res ) { } , ...
如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求: import requests proxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080", } requests.get(...
为实现这一功能,开发者常常利用设计模式来辅助,其中一种常用的方法是使用"代理"(Proxies)。本文将详细探讨如何通过JavaScript的Proxy对象来实现对象撤消/重做以及记录更改历史。 首先,让我们理解什么是Proxy。...
在Java编程领域,网络通信和代理(Proxies)是重要的组成部分,特别是在开发需要跨网络进行数据交换的应用时。本文将详细解析"Java Networking and Proxies Code"这一主题,包括如何启动一个线程来检查URL是否通过...
资源分类:Python库 所属语言:Python 资源全名:proxies_l-0.0.3.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
你可以定义哪些IP地址或代理服务器白名单,甚至实现复杂的验证逻辑,如检查代理服务器的证书或连接到代理服务器进行身份验证。 6. **日志与调试**:为了便于调试和监控,`laravel-valid-proxies`可能提供日志功能,...
这通常通过向某个网站发送带有代理设置的请求来实现。Python的`requests`库支持设置代理,我们可以使用`proxies`参数。 3. **验证代理IP**: - 设置代理:`proxies = {'http': 'http://ip:port', '...
标题中的"Delphi_Proxy_Scraper.zip_Proxies"暗示了这是一个使用Delphi编程语言编写的代理服务器抓取程序。Delphi是一种基于Object Pascal的集成开发环境(IDE),常用于创建桌面应用程序。在这个项目中,开发者可能...
在C#中,可以使用虚方法、抽象类或接口实现静态代理,或者利用.NET的`System.Runtime.Remoting.Proxies`命名空间实现动态代理。 9. **适配器模式(Adapter)**:将一个类的接口转换成客户希望的另一个接口。适配器...
用户通过浏览器配置代理服务器,所有的网页请求都会通过这个服务器转发,同样可以实现匿名浏览和访问受限的网站。但是,WEB代理通常不支持非HTTP协议的服务,比如邮件、FTP等。 压缩包内的文件 "说明.txt" 可能包含...
安装pip install scrapy-rotating-proxies用法将带有代理列表的ROTATING_PROXY_LIST选项添加到settings.py: ROTATING_PROXY_LIST = [ 'proxy1.com:8000', 'proxy2.com:8031', # ...]或者,您可以指定一个ROTATING_...
在IT行业中,网络访问有时需要通过IP代理来实现,特别是在数据爬取、网络安全测试或跨国访问受限内容时。本文将详细讲解"IP代理采集"和"本地切换IP代理上网"的相关知识点。 首先,我们理解一下IP代理的基本概念。IP...
在MySQL 5.7.18版本中,为了实现类似用户组管理的机制,我们可以利用`proxies_priv`这一特性来模拟角色(Role)的功能。角色在数据库管理系统中通常用于批量授予用户相同的一组权限,简化权限管理。在MySQL 5.7.X...