Java/Design Pattern/Proxy Pattern

Материал из Java эксперт
Перейти к: навигация, поиск

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>