JMU
The Proxy Pattern
An Introduction with Examples in Java


Prof. David Bernstein
James Madison University

Computer Science Department
bernstdh@jmu.edu


Motivation
Implementation

One Approach (in UML)

images/proxy.gif
The Dynamics

A UML Sequence Diagram

images/proxy_sequence.gif
An Example
javaexamples/proxy/IconProxy.java
        import java.awt.*;
import java.net.*;
import javax.swing.*;

/**
 * A proxy for an Icon (an example of the Proxy pattern)
 *
 * @version 1.0
 * @author  Prof. David Bernstein, James Madison University
 */
public class IconProxy implements Icon
{
    private boolean           isLoaded, shouldLoad;
    private Image             image;
    private ImageIcon         realIcon;
    private int               height, width;
    private Toolkit           toolkit;
    private URL               url;

    private static final int  IMAGE_ID = 1;
    
    /**
     * Explicit Value Constructor
     *
     * @param file    The name of the file containing the image
     * @param width   The default width of the image
     * @param height  The default height of the image
     */
    public IconProxy(String file, int width, int height)
    {
       this.width  = width;
       this.height = height;

       image       = null;
       realIcon    = null;
       isLoaded    = false;

       toolkit  = Toolkit.getDefaultToolkit();


       try 
       {
          url = new URL(file);
          shouldLoad = true;
       } 
       catch (MalformedURLException mue) 
       {
          shouldLoad = false;
       }
    }
    
    
    /**
     * Get the height in pixels (required by Icon)
     *
     * @return   The height (in pixels)
     */
    public int getIconHeight() 
    {
       if (isLoaded) return realIcon.getIconHeight();
       else          return height;
    }



    /**
     * Get the width in pixels (required by Icon)
     *
     * @return   The width (in pixels)
     */
    public int getIconWidth() 
    {
       if (isLoaded) return realIcon.getIconWidth();
       else          return width;
    }


    
    /**
     * Draw the icon at the specified location (required by Icon)
     *
     * @param c   The Component the Icon is being drawn on
     * @param g   The Graphics context
     * @param x   The horizontal position of the upper-left corner
     * @param y   The vertical position of the upper-left corner
     */
    public void paintIcon(Component c, Graphics g, int x, int y) 
    {
       // Get the Image if necessary
       if (shouldLoad && image == null) image = toolkit.createImage(url);


       // If the URL is ok, check the status of the Image
       if (shouldLoad) 
       {
          if (image.getWidth(c) >= 0) isLoaded = true;
       }


       if(isLoaded) // Delegate to the real Icon
       {
          if (realIcon == null) realIcon = new ImageIcon(image);
          realIcon.paintIcon(c, g, x, y);
       } 
       else        // Draw a border
       {
          g.setColor(Color.black);
          g.drawString("Image", x+width/2, y+height/2);
       }
    }
}

        
An Example (cont.)
javaexamples/proxy/IconFrame.java
        import java.awt.*;
import javax.swing.*;

/**
 * A frame that contains an Icon
 *
 * @version 1.0
 * @author  Prof. David Bernstein, James Madison University
 */
public class IconFrame extends JFrame
{
    private Icon       icon;


    /**
     * Explicit Value Constructor
     *
     * @param icon   The Icon
     */
    public IconFrame(Icon icon)
    {
        this.icon = icon;
    }



    /**
     * Paint this Component
     *
     * @param g    The Graphics context
     */
    public void paint(Graphics g)
    {
        super.paint(g);
        

        icon.paintIcon(this, g, 0, 0);
    }

}
        
An Example (cont.)
javaexamples/proxy/Driver.java
        import javax.swing.*;

/**
 * An example that uses IconProxy (an example of the Proxy pattern)
 *
 * @version 1.0
 * @author  Prof. David Bernstein, James Madison University
 */
public class Driver
{
    /**
     * The entry point
     *
     * @param args   The command-line arguments
     */
    public static void main(String[] args)
    {
        Icon         icon;
        IconFrame    frame;



        // For example: http://www.lib.jmu.edu/special/SCPix/cav85+/cav85+2.jpg
        icon = new IconProxy(args[0],200,200);
        
        frame = new IconFrame(icon);
        frame.setSize(400,400);
        frame.setVisible(true);
    }


}
        
Combining Proxy and FactoryMethod

In UML

images/proxywithfactory_sequence.gif