1.虚拟代理与状态模式相结合
State
package headfirst.proxy.virtualproxy;
import java.awt.Component;
import java.awt.Graphics;
public interface State {
public int getIconWidth();
public int getIconHeight();
public void paintIcon(final Component c, Graphics g, int x, int y);
}
ImageNotLoadedState
package headfirst.proxy.virtualproxy;
import java.awt.Component;
import java.awt.Graphics;
import java.net.URL;
import javax.swing.ImageIcon;
public class ImageNotLoadedState implements State {
private URL imageURL;
private ImageIcon imageIcon;
public ImageIcon getImageIcon() {
return imageIcon;
}
public void setImageIcon(ImageIcon imageIcon) {
this.imageIcon = imageIcon;
}
private boolean retrieving = false;
private Thread retrievalThread;
private ImageProxyWithState imageProxy;
public ImageNotLoadedState(ImageProxyWithState imageProxy, URL url) {
this.imageProxy = imageProxy;
this.imageURL = url;
}
public int getIconWidth() {
return 800;
}
public int getIconHeight() {
return 600;
}
public void paintIcon(final Component c, Graphics g, int x, int y) {
g.drawString("Loading CD cover, please wait...", x+300, y+190);
if (!retrieving) {
retrieving = true;
retrievalThread = new Thread(new Runnable() {
public void run() {
try {
imageIcon = new ImageIcon(imageURL, "CD Cover");
imageProxy.setCurrentState(imageProxy.getImageLoadedState());
((ImageLoadedState)imageProxy.getImageLoadedState()).setImageIcon(
((ImageNotLoadedState)imageProxy.getImageNotLoadedState()).getImageIcon());
c.repaint();
} catch (Exception e) {
e.printStackTrace();
}
}
});
retrievalThread.start();
}
}
}
ImageLoadedState
package headfirst.proxy.virtualproxy;
import java.awt.Component;
import java.awt.Graphics;
import javax.swing.ImageIcon;
public class ImageLoadedState implements State {
private ImageIcon imageIcon;
public ImageIcon getImageIcon() {
return imageIcon;
}
public void setImageIcon(ImageIcon imageIcon) {
this.imageIcon = imageIcon;
}
public int getIconWidth() {
return imageIcon.getIconWidth();
}
public int getIconHeight() {
return imageIcon.getIconHeight();
}
public void paintIcon(Component c, Graphics g, int x, int y) {
imageIcon.paintIcon(c, g, x, y);
}
}
ImageProxyWithState
package headfirst.proxy.virtualproxy;
import java.awt.Component;
import java.awt.Graphics;
import java.net.URL;
import javax.swing.Icon;
class ImageProxyWithState implements Icon {
State currentState;
State imageNotLoadedState;
State imageLoadedState;
public ImageProxyWithState(URL url) {
imageNotLoadedState = new ImageNotLoadedState(this, url);
imageLoadedState = new ImageLoadedState();
currentState = imageNotLoadedState;
}
public State getCurrentState() {
return currentState;
}
public void setCurrentState(State currentState) {
this.currentState = currentState;
}
public State getImageNotLoadedState() {
return imageNotLoadedState;
}
public void setImageNotLoadedState(State imageNotLoadedState) {
this.imageNotLoadedState = imageNotLoadedState;
}
public State getImageLoadedState() {
return imageLoadedState;
}
public void setImageLoadedState(State imageLoadedState) {
this.imageLoadedState = imageLoadedState;
}
public int getIconWidth() {
return currentState.getIconWidth();
}
public int getIconHeight() {
return currentState.getIconHeight();
}
public void paintIcon(final Component c, Graphics g, int x, int y) {
currentState.paintIcon(c, g, x, y);
}
}
2.Java动态代理实现机制及扩展
http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/
http://www.ibm.com/developerworks/cn/java/j-lo-proxy2/
分享到:
相关推荐
这个“Java版设计模式学习笔记”涵盖了多种设计模式,旨在帮助开发者更好地理解和应用这些模式。让我们深入探讨一下其中可能包含的关键知识点。 一、单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问...
在《23个设计模式图解--学习笔记》中,我们探讨了这些模式,以便于理解和应用到实际开发中。以下是这23个设计模式的详细说明: 1. **工厂方法**(Factory Method):定义一个用于创建对象的接口,让子类决定实例化...
这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...
2. 结构型模式:包括适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。它们处理对象之间的关系,如组合...
- 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 - 外观模式(Facade):为子系统提供一个统一的接口,使得子系统的复杂性对客户透明。 - 适配器模式(Adapter):使两个不兼容的接口能够...
结构型模式涉及如何组合类和对象以获得更大的结构,如代理模式(Proxy)、装饰模式(Decorator)和适配器模式(Adapter)。代理模式为其他对象提供一种代理以控制对这个对象的访问;装饰模式可以在不影响其他对象的...
### 设计模式复习笔记大全 #### 一、设计模式概览 **设计模式**是一种用于在特定场景下解决常见设计问题的方案。它通常描述了一组相互作用的类和对象,以及这些对象如何通信来解决问题。设计模式的核心要素包括...
装饰模式(Decorator)可以在运行时动态地给对象添加新的行为或责任,而代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的访问。 行为型模式关注对象之间的交互和职责分配。策略模式(Strategy)定义了一...
在《JAVA与模式读书笔记》中,我们探讨的是Java编程语言与设计模式的结合应用,这对于深入理解面向对象编程和提升软件开发能力至关重要。设计模式是软件工程中的最佳实践,它们是解决常见问题的模板,可以提高代码的...
代理模式分为静态代理和动态代理,其中动态代理在Java中可以通过InvocationHandler接口和Proxy类实现。 2. **单例模式**: 单例模式确保一个类只有一个实例,并提供全局访问点。这种模式常用于控制资源的共享,如...
Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理,这个代理对象可以在调用原始对象的方法之前或之后执行额外的操作。代理模式在软件工程中有多种应用,例如:增加安全控制、性能监控、事务管理等。...
最后,代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的访问。Java中的动态代理机制,通过实现`InvocationHandler`接口,可以在运行时动态创建代理类。 这些设计模式都是Java开发中不可或缺的工具,它们...
在本篇Spring学习笔记中,我们将深入探讨动态代理模式,并结合Spring框架的实现进行分析演示。动态代理模式是Java编程中一种重要的设计模式,它允许我们在不修改原对象代码的情况下,为对象添加额外的功能或行为。...
本资料“图解Java设计模式笔记总结word版本”聚焦于通过图文并茂的方式,深入浅出地解析各种设计模式。以下是基于这个主题的详细知识点讲解: 1. **设计模式的分类** - **创建型模式**:如单例(Singleton)、工厂...
### 设计模式总结笔记 #### 一、概述 设计模式是一种在特定上下文中解决软件设计问题的方案。它并不是一种现成的代码片段或者框架,而是一种指导思想,帮助开发者理解如何更好地组织代码来解决问题。设计模式可以...
结构型模式处理对象组合,比如适配器模式(Adapter)用于接口转换,装饰者模式(Decorator)允许在运行时动态地给对象添加新的行为或职责,以及代理模式(Proxy)提供一个代表对象来控制对原对象的访问。行为型模式...
这份由台湾作者编写的笔记,结合Java语言,为读者提供了一种深入理解并应用设计模式的方式。以下是对这些设计模式的详细解释: 1. **创建型模式(Creational Patterns)** 创建型模式关注于对象的创建过程,它们帮助...
在本篇Spring学习笔记中,我们将探讨静态代理模式在Spring框架中的应用与分析。静态代理是一种常见的设计模式,它在不修改目标类代码的情况下,通过代理类来扩展或增强目标类的功能。在Spring中,静态代理主要应用于...
2. **结构型模式**(Structural Patterns):主要关注如何组合类和对象以实现更大的结构,包括适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、...
这份"图解java设计模式_学习笔记"是针对Java开发者深入理解和应用设计模式的重要资源。在这里,我们将深入探讨Java设计模式的核心概念、分类以及它们在实际开发中的应用。 设计模式分为三大类:创建型、结构型和...