Java/Design Pattern/Proxy Pattern

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

Another Proxy Pattern

/*
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





Proxy Pattern 2

//[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);
  }
}





Proxy pattern in 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();
  }
}