Java/Design Pattern/Proxy Pattern
Another Proxy Pattern
<source lang="java">
/* Software Architecture Design Patterns in Java by Partha Kuchana Auerbach Publications
- /
import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.Vector; public class MainProxyApp {
public static void main(String[] args) { OrderIF order = new OrderProxy(); Vector v = order.getAllOrders(); v = order.getAllOrders(); v = order.getAllOrders(); v = order.getAllOrders(); }
} class OrderProxy implements OrderIF {
private int counter = 0; public Vector getAllOrders() { Order order = new Order(); counter++; long t1 = System.currentTimeMillis(); Vector v = order.getAllOrders(); long t2 = System.currentTimeMillis(); long timeDiff = t2 - t1; String msg = "Iteration=" + counter + "::Time=" + timeDiff + "ms"; //log the message FileUtil fileUtil = new FileUtil(); fileUtil.writeToFile("log.txt", msg, true, true); return v; }
} interface OrderIF {
public Vector getAllOrders();
} class Order implements OrderIF {
public Vector getAllOrders() { FileUtil fileUtil = new FileUtil(); Vector v = fileUtil.fileToVector("orders.txt"); return v; }
} class MiscUtil {
public static boolean hasDuplicates(Vector v) { int i = 0; int j = 0; boolean duplicates = false; for (i = 0; i < v.size() - 1; i++) { for (j = (i + 1); j < v.size(); j++) { if (v.elementAt(i).toString().equalsIgnoreCase( v.elementAt(j).toString())) { duplicates = true; } } } return duplicates; } public static Vector removeDuplicates(Vector s) { int i = 0; int j = 0; boolean duplicates = false; Vector v = new Vector(); for (i = 0; i < s.size(); i++) { duplicates = false; for (j = (i + 1); j < s.size(); j++) { if (s.elementAt(i).toString().equalsIgnoreCase( s.elementAt(j).toString())) { duplicates = true; } } if (duplicates == false) { v.addElement(s.elementAt(i).toString().trim()); } } return v; } public static Vector removeDuplicateDomains(Vector s) { int i = 0; int j = 0; boolean duplicates = false; String str1 = ""; String str2 = ""; Vector v = new Vector(); for (i = 0; i < s.size(); i++) { duplicates = false; for (j = (i + 1); j < s.size(); j++) { str1 = ""; str2 = ""; str1 = s.elementAt(i).toString().trim(); str2 = s.elementAt(j).toString().trim(); if (str1.indexOf("@") > -1) { str1 = str1.substring(str1.indexOf("@")); } if (str2.indexOf("@") > -1) { str2 = str2.substring(str2.indexOf("@")); } if (str1.equalsIgnoreCase(str2)) { duplicates = true; } } if (duplicates == false) { v.addElement(s.elementAt(i).toString().trim()); } } return v; } public static boolean areVectorsEqual(Vector a, Vector b) { if (a.size() != b.size()) { return false; } int i = 0; int vectorSize = a.size(); boolean identical = true; for (i = 0; i < vectorSize; i++) { if (!(a.elementAt(i).toString().equalsIgnoreCase(b.elementAt(i) .toString()))) { identical = false; } } return identical; } public static Vector removeDuplicates(Vector a, Vector b) { int i = 0; int j = 0; boolean present = true; Vector v = new Vector(); for (i = 0; i < a.size(); i++) { present = false; for (j = 0; j < b.size(); j++) { if (a.elementAt(i).toString().equalsIgnoreCase( b.elementAt(j).toString())) { present = true; } } if (!(present)) { v.addElement(a.elementAt(i)); } } return v; }
}// end of class class FileUtil {
DataOutputStream dos; /* * Utility method to write a given text to a file */ public boolean writeToFile(String fileName, String dataLine, boolean isAppendMode, boolean isNewLine) { if (isNewLine) { dataLine = "\n" + dataLine; } try { File outFile = new File(fileName); if (isAppendMode) { dos = new DataOutputStream(new FileOutputStream(fileName, true)); } else { dos = new DataOutputStream(new FileOutputStream(outFile)); } dos.writeBytes(dataLine); dos.close(); } catch (FileNotFoundException ex) { return (false); } catch (IOException ex) { return (false); } return (true); } /* * Reads data from a given file */ public String readFromFile(String fileName) { String DataLine = ""; try { File inFile = new File(fileName); BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(inFile))); DataLine = br.readLine(); br.close(); } catch (FileNotFoundException ex) { return (null); } catch (IOException ex) { return (null); } return (DataLine); } public boolean isFileExists(String fileName) { File file = new File(fileName); return file.exists(); } public boolean deleteFile(String fileName) { File file = new File(fileName); return file.delete(); } /* * Reads data from a given file into a Vector */ public Vector fileToVector(String fileName) { Vector v = new Vector(); String inputLine; try { File inFile = new File(fileName); BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(inFile))); while ((inputLine = br.readLine()) != null) { v.addElement(inputLine.trim()); } br.close(); } // Try catch (FileNotFoundException ex) { // } catch (IOException ex) { // } return (v); } /* * Writes data from an input vector to a given file */ public void vectorToFile(Vector v, String fileName) { for (int i = 0; i < v.size(); i++) { writeToFile(fileName, (String) v.elementAt(i), true, true); } } /* * Copies unique rows from a source file to a destination file */ public void copyUniqueElements(String sourceFile, String resultFile) { Vector v = fileToVector(sourceFile); v = MiscUtil.removeDuplicates(v); vectorToFile(v, resultFile); }
} // end FileUtil
</source>
Proxy Pattern 2
<source lang="java">
//[C] 2002 Sun Microsystems, Inc.---
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; public class RunProxyPattern {
public static void main(String[] arguments) { System.out.println("Example for the Proxy pattern"); System.out.println(); System.out.println("This code will demonstrate the use of a Proxy to"); System.out.println(" provide functionality in place of its underlying"); System.out.println(" class."); System.out.println(); System.out .println(" Initially, an AddressBookProxy object will provide"); System.out.println(" address book support without requiring that the"); System.out .println(" AddressBookImpl be created. This could potentially"); System.out.println(" make the application run much faster, since the"); System.out .println(" AddressBookImpl would need to read in all addresses"); System.out.println(" from a file when it is first created."); System.out.println(); if (!(new File("data.ser").exists())) { DataCreator.serialize("data.ser"); } System.out.println("Creating the AddressBookProxy"); AddressBookProxy proxy = new AddressBookProxy("data.ser"); System.out.println("Adding entries to the AddressBookProxy"); System.out.println("(this operation can be done by the Proxy, without"); System.out.println(" creating an AddressBookImpl object)"); proxy.add(new AddressImpl("Sun Education [CO]", "500 El Dorado Blvd.", "Broomfield", "CO", "80020")); proxy.add(new AddressImpl("Apple Inc.", "1 Infinite Loop", "Redwood City", "CA", "93741")); System.out.println("Addresses created. Retrieving an address"); System.out .println("(since the address is stored by the Proxy, there is"); System.out .println(" still no need to create an AddressBookImpl object)"); System.out.println(); System.out.println(proxy.getAddress("Sun Education [CO]").getAddress()); System.out.println(); System.out .println("So far, all operations have been handled by the Proxy,"); System.out .println(" without any involvement from the AddressBookImpl."); System.out.println(" Now, a call to the method getAllAddresses will"); System.out.println(" force instantiation of AddressBookImpl, and will"); System.out.println(" retrieve ALL addresses that are stored."); System.out.println(); ArrayList addresses = proxy.getAllAddresses(); System.out.println("Addresses retrieved. Addresses currently stored:"); System.out.println(addresses); }
} interface Address extends Serializable {
public static final String EOL_STRING = System .getProperty("line.separator"); public static final String SPACE = " "; public static final String COMMA = ","; public String getAddress(); public String getType(); public String getDescription(); public String getStreet(); public String getCity(); public String getState(); public String getZipCode(); public void setType(String newType); public void setDescription(String newDescription); public void setStreet(String newStreet); public void setCity(String newCity); public void setState(String newState); public void setZipCode(String newZip);
} interface AddressBook {
public void add(Address address); public ArrayList getAllAddresses(); public Address getAddress(String description); public void open(); public void save();
} class FileLoader {
public static Object loadData(File inputFile) { Object returnValue = null; try { if (inputFile.exists()) { if (inputFile.isFile()) { ObjectInputStream readIn = new ObjectInputStream( new FileInputStream(inputFile)); returnValue = readIn.readObject(); readIn.close(); } else { System.err.println(inputFile + " is a directory."); } } else { System.err.println("File " + inputFile + " does not exist."); } } catch (ClassNotFoundException exc) { exc.printStackTrace(); } catch (IOException exc) { exc.printStackTrace(); } return returnValue; } public static void storeData(File outputFile, Serializable data) { try { ObjectOutputStream writeOut = new ObjectOutputStream( new FileOutputStream(outputFile)); writeOut.writeObject(data); writeOut.close(); } catch (IOException exc) { exc.printStackTrace(); } }
} class DataCreator {
private static final String DEFAULT_FILE = "data.ser"; public static void main(String[] args) { String fileName; if (args.length == 1) { fileName = args[0]; } else { fileName = DEFAULT_FILE; } serialize(fileName); } public static void serialize(String fileName) { try { serializeToFile(createData(), fileName); } catch (IOException exc) { exc.printStackTrace(); } } private static Serializable createData() { ArrayList items = new ArrayList(); items.add(new AddressImpl("Home address", "1418 Appian Way", "Pleasantville", "NH", "27415")); items.add(new AddressImpl("Resort", "711 Casino Ave.", "Atlantic City", "NJ", "91720")); items.add(new AddressImpl("Vacation spot", "90 Ka"ahanau Cir.", "Haleiwa", "HI", "41720")); return items; } private static void serializeToFile(Serializable data, String fileName) throws IOException { ObjectOutputStream serOut = new ObjectOutputStream( new FileOutputStream(fileName)); serOut.writeObject(data); serOut.close(); }
} class AddressImpl implements Address {
private String type; private String description; private String street; private String city; private String state; private String zipCode; public static final String HOME = "home"; public static final String WORK = "work"; public AddressImpl() { } public AddressImpl(String newDescription, String newStreet, String newCity, String newState, String newZipCode) { description = newDescription; street = newStreet; city = newCity; state = newState; zipCode = newZipCode; } public String getType() { return type; } public String getDescription() { return description; } public String getStreet() { return street; } public String getCity() { return city; } public String getState() { return state; } public String getZipCode() { return zipCode; } public void setType(String newType) { type = newType; } public void setDescription(String newDescription) { description = newDescription; } public void setStreet(String newStreet) { street = newStreet; } public void setCity(String newCity) { city = newCity; } public void setState(String newState) { state = newState; } public void setZipCode(String newZip) { zipCode = newZip; } public String toString() { return description; } public String getAddress() { return description + EOL_STRING + street + EOL_STRING + city + COMMA + SPACE + state + SPACE + zipCode + EOL_STRING; }
} class AddressBookProxy implements AddressBook {
private File file; private AddressBookImpl addressBook; private ArrayList localAddresses = new ArrayList(); public AddressBookProxy(String filename) { file = new File(filename); } public void open() { addressBook = new AddressBookImpl(file); Iterator addressIterator = localAddresses.iterator(); while (addressIterator.hasNext()) { addressBook.add((Address) addressIterator.next()); } } public void save() { if (addressBook != null) { addressBook.save(); } else if (!localAddresses.isEmpty()) { open(); addressBook.save(); } } public ArrayList getAllAddresses() { if (addressBook == null) { open(); } return addressBook.getAllAddresses(); } public Address getAddress(String description) { if (!localAddresses.isEmpty()) { Iterator addressIterator = localAddresses.iterator(); while (addressIterator.hasNext()) { AddressImpl address = (AddressImpl) addressIterator.next(); if (address.getDescription().equalsIgnoreCase(description)) { return address; } } } if (addressBook == null) { open(); } return addressBook.getAddress(description); } public void add(Address address) { if (addressBook != null) { addressBook.add(address); } else if (!localAddresses.contains(address)) { localAddresses.add(address); } }
} class AddressBookImpl implements AddressBook {
private File file; private ArrayList addresses = new ArrayList(); public AddressBookImpl(File newFile) { file = newFile; open(); } public ArrayList getAllAddresses() { return addresses; } public Address getAddress(String description) { Iterator addressIterator = addresses.iterator(); while (addressIterator.hasNext()) { AddressImpl address = (AddressImpl) addressIterator.next(); if (address.getDescription().equalsIgnoreCase(description)) { return address; } } return null; } public void add(Address address) { if (!addresses.contains(address)) { addresses.add(address); } } public void open() { addresses = (ArrayList) FileLoader.loadData(file); } public void save() { FileLoader.storeData(file, addresses); }
}
</source>
Proxy pattern in Java
<source lang="java">
/* The Design Patterns Java Companion Copyright (C) 1998, by James W. Cooper IBM Thomas J. Watson Research Center
- /
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.Label; import java.awt.MediaTracker; import java.awt.Toolkit; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JPanel; public class ProxyDisplay extends JFrame {
public ProxyDisplay() { super("Display proxied image"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); JPanel p = new JPanel(); getContentPane().add(p); p.setLayout(new BorderLayout()); ImageProxy image = new ImageProxy("elliott.jpg", 321, 271); p.add("Center", image); p.add("North", new Label(" ")); p.add("West", new Label(" ")); setSize(370, 350); setVisible(true); } static public void main(String[] argv) { new ProxyDisplay(); }
} //================================== class ImageProxy extends JPanel implements Runnable {
int height, width; MediaTracker tracker; Image img; JFrame frame; Thread imageCheck; //to monitor loading public ImageProxy(String filename, int w, int h) { height = h; width = w; tracker = new MediaTracker(this); img = Toolkit.getDefaultToolkit().getImage(filename); tracker.addImage(img, 0); //watch for image loading imageCheck = new Thread(this); imageCheck.start(); //start 2nd thread monitor //this begins actual image loading try { tracker.waitForID(0, 1); } catch (InterruptedException e) { } } public void paint(Graphics g) { if (tracker.checkID(0)) { height = img.getHeight(frame); //get height width = img.getWidth(frame); //and width g.setColor(Color.lightGray); //erase box g.fillRect(0, 0, width, height); g.drawImage(img, 0, 0, this); //draw loaded image } else { //draw box outlining image if not loaded yet g.setColor(Color.black); g.drawRect(1, 1, width - 2, height - 2); } } public Dimension getPreferredSize() { return new Dimension(width, height); } //public int getWidth() {return width;} //public int getHeight(){return height;} public void run() { //this thread monitors image loading //and repaints when done //the 1000 msec is artifically long //to allow demo to display with delay try { Thread.sleep(1000); while (!tracker.checkID(0)) Thread.sleep(1000); } catch (Exception e) { } repaint(); }
}
</source>