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/